每日一题 | day15( 查找输入整数二进制中1的个数 | 手套)
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day15( 查找输入整数二进制中1的个数 | 手套)相关的知识,希望对你有一定的参考价值。
选择题
1、对两个字符a和b进行初始化:char a[]=“ABCDEF”;char b[]={‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};则以下叙述正确的
A a数组比b数组长度长
B a与b长度相同
C a与b数组完全相同
D a和b中都存放字符串
正确答案 A:字符数组a中有\\0,而字符数组b中没有。求长度应该使用strlen(),可是b是一个没有\\0的字符数组,所以长度应该是未知的。所以选择A应该换成大小,sizeof(a) = 7,sizeof(b) = 6<。所以a数组比b数组大/font>
2、x是一个行列数均为1000二维数组,下面代码效率执行最高的是()
A for(int j=0;j<1000;j++) for(int i=0;i<1000;i++) x[i][j]+=x[j][i];
B for(int i=0;i<1000;j++) for(int j=0;j<1000;j++) x[i][j]+=x[j][i];
C for(int i=0;i<1000;j++) for(int j=0;j<1000;j++) x[j][i]+=x[j][i];
D for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) x[i][j]+=x[i][j];
正确答案 D:因为cache会预读当前页的后几页,如果命中,就会继续预读后面的页面,加快速度。因为数组的预读是逐行预读的,所以D的情况最快,而其他几个选项有跳列的情况
3、假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。
CSomething a();
CSomething b(2);
CSomething c[3];
CSomething &ra = b;
CSomething d=b;
CSomething *pA = c;
CSomething *p = new CSomething(4);
A 10
B 9
C 8
D 7
E 6
F 5
正确答案 E:a是声明的一个函数名,其实函数的返回值为CSomething;b创建一个对象;c是创建3个对象;ra引用并没创建对象;d的b创建了和b一样的对象;pA是一个指针,指向了c,没创建对象;p指向一个值为4的一个新的对象;所以共有6次
编程题
题目1
题解思路:3分钟搞定 微软面试题—求二进制中1的个数(详解)
代码:
#include <iostream>
using namespace std;
int findNumberOf1(int num)
{
int count = 0;
while (num)
{
++count;
num &= (num - 1);
}
return count;
}
int main()
{
int n;
while (cin >> n)
{
int res = findNumberOf1(n);
cout << res << endl;
}
return 0;
}
题目2
题解思路:数组下标就是对应一种颜色,左手和右手中同下标表示的是同一种颜色。由于题目说了,无法分别颜色,所以我们就必须将所有的颜色都至少拿到1个,然后再去另一边取。才能保证我们拿的左右手手套最少有一套是相同的。我们举个例子,假如左手中的手套为[2,3,4,6,5],那我们如何保证一个手套最少都能拿到一双呢,最好情况下肯定是每个颜色都那一个,但是题目都说了时昏暗条件无法区分颜色,所以我们需要算最坏的情况下。我们可以将手套数量的和加起来,然后减去颜色最少数量的手套,再+1,就肯定可以拿到全部颜色。这里2+3+4+6+5-2+1=19,我们至少要拿19只手套才行。如果是18个,坏情况下是拿了数量为3,4,5,6的手套,而第一种颜色的手套就无法保证拿到,所以最后要加1就是保证了5种颜色的手套都拿到。而最后我们在左右手手套中,取出它们各自最少要拿的手套个数相比。例如左手少,我们只要再+1,也就是从右手边随便选一种都可以匹配上。但是我们要考虑为0的情况。如果左手边为0,右手边不为0,或者右手边为0而左手边不为0的情况,我们都必须将这种颜色取出。例如有5种颜色,左手边存在数量为0的颜色的手套。当左边的手套的数量取的最少,此时要从右边选一个手套时,有可能选了那个为0的手套的颜色。所以此时只要有一边的颜色为0,都要将该颜色对应的另一边的手套都取出。
代码:
class Gloves {
public:
int findMinimum(int n, vector<int> left, vector<int> right)
{
int left_sum = 0, left_min = INT_MAX;
int right_sum = 0, right_min = INT_MAX;
int sum = 0;
for (int i = 0; i < n; ++i)
{
if (left[i] * right[i] == 0) //同一颜色存在一边手套数量为0,需要累加求和
{
sum +=left[i] + right[i];
}
else
{
left_sum += left[i];
left_min = left_min < left[i] ? left_min : left[i];
right_sum += right[i];
right_min = right_min < right[i] ? right_min : right[i];
}
}
return sum + min(left_sum - left_min + 1, right_sum - right_min + 1) + 1;
}
};
以上是关于每日一题 | day15( 查找输入整数二进制中1的个数 | 手套)的主要内容,如果未能解决你的问题,请参考以下文章