题目1:
给出两个数m和n,要求给出两个数的二进制表示有多少个不同的位。
tips:说来惭愧,笔试时有了想法,但是前面花了太多不必要的时间,到这题都没时间写了。现在要开始训练做题速度了,笔试时有思路是没什么用处。
思路:开一个数组d[32],用1>>i来初始化所有的值,然后用m和n分别于d[i]进行&运算,如果结果不同,则计数+1
代码:
int countBitDiff(int m, int n)
{
int sum = 0;
int d[32];
for (int i = 0; i < 32; i++)
d[i] = 1 << i; //当i=31时,会溢出,值变成负数
for (int i = 0; i < 32;i++)
if ((m & d[i]) != (n &d[i]))
sum++;
return sum;
}
但是后来想了一下,还是有bug的,就是边界值问题,i一旦为31时,1>>31就会溢出,变为负数。回来之后想了半天,改进了以上算法。
int countBitDiff(int m, int n)
{
int sum = 0;
for (int i = 0; i < 32;i++)
{
if ((m >> i & 0x1) != (n >> i & 0x1))
sum++;
}
return sum;
}
这次改为让m,n右移,不仅减少了开数组的内存消耗,还解决了溢出问题。
运行结果:
题目2:
有重复元素的全排序问题,算是常规题了。
当时想写两种方法的,但是卷面空间不足(好吧,我承认是我写字太大了......),就写了用c++ STL里面的next_permutation()函数,这算是一种取巧的方法,但是不知道判卷如何给分,估计挺少......
第二种方法我以前在博客里面总结过,采用递归的方法,不断与后面的数据进行交换,但是要判断是否相同,直接上链接
http://blog.csdn.net/cq340321/article/details/53264448