0..n去掉一个数,给你剩下的数,找出去掉的那个数

来源:互联网 发布:linux查看命令 编辑:程序博客网 时间:2024/05/16 14:41

   转载请注明转自blog.csdn.net/souldak , 微博@evagle

    首先,考虑没有去掉那些数,如果n是奇数,n+1个最低位肯定是0101...01,count(0)=count(1),如果n是偶数,0101...010那么0要比1多一个,count(0)=count(1)+1

例子n=4

0=00 1=01 2=10 3=11 4=100,最低位有3个02个1,

所以规律是,如果没有去掉一个数时,count(0)=count(1)+[0,1], 如果去掉的数最低位是0,即count(0)-1,那么count(1)>=count(0).

如果去掉的是1,count(1)-1,那么count(0)>=count(1)+1

这是两种不同的情况,我们根据这个规律推算去掉的数最低位是啥。统计剩下的n个数最低位0和1的个数:

如果count(1)>=count(0) ,那么去掉的是0

如果count(0)>count(1) ,那么去掉的是1

然后接下来,确定倒数第二位。我们尽量使得倒数第二位能和倒数第一位那样推导。

如果最低位是0,那么我们把所有是最低位是1的数全部去掉,剩下的全是最低位为0的,如果剩下的数全部右移一位将最低位去掉,那么正好就和上面的情况一样了。

如果最低位是1,那么我们把所有是最低位是0的数全部去掉,剩下的全是最低位为1的,右移一位,也正好是和上面的情况一样了。

举个例子:

0,1,2,3,4,5,6,7 将最低位为0的去掉就剩下1,3,5,7 其实相当于是隔一个数删一个数,再右移一位(除以2),得到0,1,2,3,如果去掉的是5,那么剩下的是0,1,3. 这个正好是0到n/2中去掉了一个数,找出那个数来。这样就可以用上面的方法找到倒数第二位了。

还是这个例子,0~7,去掉了3:

0. 输入是0,1,2,4,5,6,7

1.先得到count(0)>count(1) 所以最低位是1

2.去掉最低位是0的,剩下1,5,7, 然后右移一位,0,2,3

3. 输入变为0,2,3, 回到第一步

这样依次得到1,1,0,这个是最低位最先算,所以结果就是011=3




原创粉丝点击