职上青云笔试题

来源:互联网 发布:淘宝店售假了换网线 编辑:程序博客网 时间:2024/04/27 22:05

  题目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


0 0
原创粉丝点击