【算法百题之二十一】20网易面试题-二进制计数
程序员文章站
2024-03-24 21:30:22
...
【算法百题之二十一】二进制计数
大家好,我是Lampard~~
很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!
今天的问题是:
小A刚学了二进制,他十分激动。为了确定他的确掌握了二进制,你给他出了这样一道题目:给定N个非负整数,将这N个数字按照二进制下1的个数分类,二进制下1的个数相同的数字属于同一类。求最后一共有几类数字?
思路:
题目很简单,我们知道把十进制转换为二进制的方法是一直对2求余,然后逆序输出。
所以第一步:要求1的个数只需要我们把N个数字,循环利用转换为2进制的方式记录1的个数就好。
int NumOfOne(int num)
{
// 数出二进制中1的数量
int count = 0;
while (num)
{
if (num % 2 == 1)
{
count++;
num = num / 2;
}
else
num = num / 2;
}
return count;
}
第二步:这时我们需要一个向量vectorA来存储记录不同种类的1的个数,如果1的个数重复,就不插入这个值。新值则插入。
for (int i = 0; i < Num; i++)
{
cout << "请输入数组的大小:" << endl;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> array[i];
}
for (int i = 0; i < n; i++)
{
int flag = 0;
for (int j = 0; j < VectorA.size(); j++)
{
if (VectorA[j] == NumOfOne(array[i]))
flag = 1;
}
if(flag == 0)
VectorA.push_back(NumOfOne(array[i]));
}
第三步:因为题目要求输入N组数据,所以我们需要用一个向量vectorB来存储每一组数据(vectorA的大小)的结果。
VectorB.push_back(VectorA.size());
// 输出答案
for (int j = 0; j < VectorB.size(); j++)
{
// 输出各个案例的1的个数
cout << VectorB[j] << endl;
}
测试用例与答案:
OK,今天的博客就到这里,谢谢大家!!!
上一篇: 【博客园】博皮美化