CCI 复习笔记 5

来源:互联网 发布:程序员外包项目 编辑:程序博客网 时间:2024/06/16 01:00

亚马逊的这个实习悬了,和学校管这个的聊天才发现基本上只能改到夏天,然后再延期一学期,但是老板似乎想直接把我介绍给他的关系户了。虽然我感觉好像那个工作也还不错。。。工资特么都差不多其实


微软终面,下周四,飞个华盛顿,免费旅游一趟也不错。谷歌二面,周四。Palantier周四和HR聊。SIG鸟我了,时间上不确定。话说我这复习了一个月的代码,突然面个矿工,有点搞笑的。。。


废话不多说,第五章,bit manipulation


5.1 有两个binary数字,给出两个位置, i , j,要求把M替换到N里面去,100000,111,i=1,j=3  => 100111


这个问题有一个简化版,同样长度的数字,M,N,如何让M变成N。方法是这样,(M&0)|N,&0就把所有数字变0了,对于一个0来说自然可以 or出任何数字


然后现实的做法是先把M和1110001111这种做一个and,然后再和1110000做一个or。组装11100000可以用~0或者(i<<x)-1(取决于大小),之后再做<<。 然后再用or组装111000111,之后用and清楚中间的数字。再用or把左移的数字组装上去。。。


5.2 常规题,把小数转化为二进制


先考虑下如何把一个大于零的数字转化为n进制,很简单,X%n是最后一个数字,然后X=X/n。那么小数呢,X*n,如果X*n>0, 那么第一个数字就是int(X*n),X=X*n-int(X*n)


5.3 给出一个二进制数N,给出最接近的两个数,这两个数字的1的个数和N相同


这个题有点麻烦,主要的问题是,得先找到规律。10111的最接近的大数应该是11011,所以就大数来讲,似乎是把最后一个0和之后的1对调。如果没有0,那就只能创造一个0在最前面。

10111的最接近的小数似乎应该就是01111了,从这个例子看似乎是最后一个零之前的数字对调。


对比书上发现以上的是错误的。。。。这题就是需要想到比较具有普遍性的例子。


对于大数,正确的做法是,找到最右边的non-trailing zero,然后变成1,之后按照最小方式重新填充右边(清零以后)

对于小数,找到最右边的non-trailing ones,然后变0,按照最大方式填充右边。


5.4 n&(n-1) ==0是在干啥


代表n和n-1没有一个position是同时有1的,最后两位数有四种可能11,10,01,00,其中11-1=10,10-1=01,01-1=00,00-1=11,所以11是不行的,其他是可以的,但是如果是10,或者01之前必须全部是0,因为这个减法不影响前面的数字,只有00会影响,而00如果不是持续影响,不影响也得是0,综合来看,只有100000这个数字类型是可以的,所以n是2的幂


还有啥方法检测是不是2的幂呢?只能是while(n&1==0) n=n>>1, if n!=1 return false


5.5 多少次flip才能把数字A转化成数字B


这个题,莫非不是就算算有多少个数字不一样?一个^就搞定了。这题说不用c>>1而用c&(c-1)消除没用的尾数0,1000110&1000101。这玩意真心想不到,也懒得想


5.6 swap基数和偶数位置的数字


偶数位置的数字提取之后左移,偶数位置的数字提取后右移。

现在就需要一个101010101这种mask,这个地方十六进制就牛逼了。因为0xaaaaa 就是1010....而0x5555就是0101,如果不用这个生做也是有点烦


5.7 这题有点复杂,说你有一个数组,有序的序列0-N,然后少了一个数,你唯一可以用的方程是取得第i个数字的第j个bit。用linear time找到那个数字


0000 0001

0010 0011

0100 0101


假设N是奇数,也就是说总共有偶数个数字。那么尾数是1和0的个数一定平衡,那样貌似就可以重组了?

如果是偶数,可以先判断是不是最后一个数,然后当做N是奇数来做?


好吧,那么,为什么1和0在偶数个数字的时候一定是在每一个位置上成对出现?假设1在非最高位置上,由于不是最高位,因此必须遍历0,1

在最高位置,由于我们讨论的是奇数个数字,也就意味着1000之后必须有1001,因此也是对的。

这个证明想当不严谨。不过大概是这么回事


书上的答案是把只要数字不匹配的都删除,我觉得似乎没有必要。不知道是不是我miss什么点


5.8 一个array,保存的都是byte,每一个bit是一个像素,要画一个从(x1,y) 到(x2,y)的横线。


这个题我感觉难度不大。用x1得到具体的位置和所在的byte(x1/8),对x2也一样,然后把这两边以及中间的变成1就行了。










0 0