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
- 0..n去掉一个数,给你剩下的数,找出去掉的那个数
- 51762,然后给你要去掉的个数,例如2,如何选择去掉的位数,使剩下的数最小。
- 给定N位数,去掉K位数,得到的N-K位数中最小的那个数?
- 找出1到n缺失的那个数
- 快速查找一组数中去掉的一个数
- 找出三个数中不相同的那个数
- 如何找出那个不存在的数?
- 有1-m个数,围成一圈,从第一个开始数,数到n的数退出,输出最后剩下的那个数
- 1-N个数随机去掉两个数,遍历一次把这两个数找出来
- JS算法:一个长度为n的数组存了1-n这n个整数,打乱顺序后去掉了其中三个,求去掉的三个数。
- 数组中,一个数出现一次,其余的数都出现2次,找出那个出现一次的数
- 数组a[N],存放了1至N-1个数,其中某个数重复一次,找出重复的那个数
- 圆圈中最后剩下的一个数
- 找出较大的一个数
- 一个数列,去掉最大和最小的数,求剩余的数的平均值
- 去掉时间后带的毫秒数
- 【2011】去掉数列中相同的数
- 去掉小写字母以外的数
- android PendingIntent
- 在Struts 2中实现文件上传
- java Thread 中断机制
- 虚拟机下Red Hat实战安装YUM与openssh安装示例
- Android平台Wifi_Direct使用
- 0..n去掉一个数,给你剩下的数,找出去掉的那个数
- setContentType和setCharacterEncoding、pageEncoding和contentType
- 设计模式 总结
- 数组模拟bit存储
- putty自动登录linux虚拟机
- UVa 10696 - f91
- [每日一题] 11gOCP 1z0-052 :2013-09-4 block header grows............................................A33
- Android PowerImageView实现,可以播放动画的强大ImageView
- Android多点触控技术实战,自由地对图片进行缩放和移动