每日一题 | 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的个数 | 手套)的主要内容,如果未能解决你的问题,请参考以下文章

算法·每日一题(详解+多解)-- day15

算法·每日一题(详解+多解)-- day15

算法·每日一题(详解+多解)-- day15

每日一题 | day12( 二进制插入 | 查找组成一个偶数最接近的两个素数)

阿铭每日一题 day 10 20180120

乱序版 ● 剑指offer每日算法题打卡题解——位运算 (题号15,16,65)