int test(int n){int nCount = 0;while(n){nCount++;n = n & (n - 1);}return nCount;}求test(9999)
對於第2條問題,我會問interviewer輸入集合的大小,以及輸出的方式。有些情況用stack可能比較高效。
int test(int n){int nCount = 0;while(n){nCount++;n = n & (n - 1);}return nCount;}
求test(9999)
2 不用递归法 求一个固定集合内的所有子集
3 假设 一个系统只发 ABCDEF六种信息 各自的概率分别为 P1 P2 P3 P4 P5 P6 求怎么设计才能达到最节省带宽 好像 具体忘了是不是这样表述的
问我怎么用python发送邮件
问我ip校验和怎么计算 我...
ps 你不是对linux很熟悉吗 为什么那两个问题都回答不上来呢?(大哥,对linux熟悉也有不会的啊 ,我真的不知道该怎么回答)
总之, 以前没碰到过类似的笔试,做的一塌糊涂
不知道各位什么看法或解法--
彪悍的人生不需要解释!
位操作比除、余操作的效率高了很多。但是,即使采用位操作,时间复杂度仍为O(log2v),log2v为二进制数的位数。那么,还能不能再降低一些复
杂度呢?如果有办法让算法的复杂度只与"1"的个数有关,复杂度不就能进一步降低了吗?
同样用10 100 001来举例。如果只考虑和1的个数相关,那么,我们是否能够在每次判断中,仅与1来进行判断呢?
为了简化这个问题,我们考虑只有一个1的情况。例如:01 000 000。
如何判断给定的二进制数里面有且仅有一个1呢?可以通过判断这个数是否是2的整数次幂来实现。另外,如果只和这一个"1"进行判断,如何设计操作呢?我
们知道的是,如果进行这个操作,结果为0或为1,就可以得到结论。
如果希望操作后的结果为0,01 000 000可以和00 111 111进行"与"操作。
这样,要进行的操作就是 01 000 000 &(01 000 000 - 00 000 001)= 01 000 000 &
00 111 111 = 0。
因此就有了解法三的代码:
代码清单2-3
1. int Count(int v)
2. {
3. int num = 0;
4. while(v)
5. {
6. v &= (v-1);
7. num++;
8. }
9. return num;
10. }
On Apr 27, 1:39 pm, kroody <kroodyl...@gmail.com> wrote:
> int test(int n)
> {
> int nCount = 0;
>
> while(n)
> {
> nCount++;
> n = n & (n - 1);
> }
>
> return nCount;}
>
> 求test(9999)
>
> 2 不用递归法 求一个固定集合内的所有子集
> 3 假设 一个系统只发 ABCDEF六种信息 各自的概率分别为 P1 P2 P3 P4 P5 P6 求怎么设计才能达到最节省带宽 好像
> 具体忘了是不是这样表述的
>
> 问我怎么用python发送邮件
> 问我ip校验和怎么计算 我...
>
> ps 你不是对linux很熟悉吗 为什么那两个问题都回答不上来呢?(大哥,对linux熟悉也有不会的啊 ,我真的不知道该怎么回答)
>
> 总之, 以前没碰到过类似的笔试,做的一塌糊涂
> 不知道各位什么看法或解法
>
> --
> 彪悍的人生不需要解释!
>
> --
> Subscription settings:http://groups.google.com/group/pongba/subscribe?hl=zh-CN
是一的个数吧?&n-1是消最低位1
On 28 Apr 2010 08:51, "songyy" <fly...@yahoo.com.cn> wrote:
第一题感觉还是挺简单的吧......
很明显 2^10 = 1024,这样 2^10 * 8 = 8192,之后做减法,重复,就出来结果是8啦~~
2的倍数还是要记清啦
On 4月27日, 下午1时39分, kroody <kroodyl...@gmail.com> wrote:
> int test(int n)
> {
> int nCount ...
第一题感觉还是挺简单的吧......
很明显 2^10 = 1024,这样 2^10 * 8 = 8192,之后做减法,重复,就出来结果是8啦~~
2的倍数还是要记清啦
int test(int n){
根据我对此题面试结果的总结,发现不靠谱的程序员还是很多的,有些人估计平时写程序都是先拷贝别人的代码,然后在其基础上修修改改来的,所以你给他一张白纸,他会连基本语法都给忘了,写出来的代码完全不着边际。
int* bsearch(int to_search, int* begin, int* end)
{
while (begin != end) {
int* middle = begin + (end - begin) / 2;
if (to_search == *middle) {
return middle;
} else if (to_search < *middle) {
end = middle;
} else if (to_search > *middle) {
begin = middle + 1;
}
}
return end;
}
感觉挺简洁的,但变量的复用(end)出了问题。如果不允许变量复用,或者使用递归的话,可能就不会出这样的问题了。
下次面试,也考别人这样的题目看看。:-)
2010/4/29 qiaojie <qia...@gmail.com>:
--
Wu Yongwei
URL: http://wyw.dcweb.cn/
现在看看,闭卷的情况下不做准备的能答出来的,那个薪资待遇再翻上2翻也未必找的到人
出面试题这位估计是刚看了《代码之美》,书里面提到了种群记数的多种方法,在后面的某一章提到了两种精美(我自己认为)的位操作:
x & (x-1) 将X的二进制最低一位1置0
x | (x+1) 将X的二进制最低一位0置1
--
"""
Keep It Simple,Stupid.
"""
Chinese Name: 白杨
Nick Name: Hamo
Homepage: http://hamobai.com/
GPG KEY ID: 0xA4691A33
Key fingerprint = 09D5 2D78 8E2B 0995 CF8E 4331 33C4 3D24 A469 1A33