找出1-100中缺失的两个数
来源:互联网 发布:低音炮蓝牙音响淘宝 编辑:程序博客网 时间:2024/05/19 03:28
题目:有一个数组 int array[100];本来应该存放的数为1~100,但是有两个数据a,b丢失了,值变成了0。问如何找出丢失的那两个数?附带条件不能开辟额外的空间。
解题思路:常见的两种解法有:1.计算a+b和a*b的值,然后在解方程求解(但是这样会使得中间某个变量过大)。2.使用bit位来标记。占用13个字节。第二种方法使用了额外空间,第一种可能会造成整型溢出。这里考虑转化为熟悉的方法。数组array[100],其下标正好为0-99,能不能利用上数组下标求解呢?答案是肯定的。这里将数组下标加一,变为1-100。将题目转化为array[0]...array[99]以及1-100 这总共200个数中,两个只出现一次的数(解法参见http://zhedahht.blog.163.com/blog/static/2541117420071128950682/)。实现代码如下:
/*author:<song0071000#126.com>time:2014/03/25function:find two number in array*/void find_lost_two(int array[],int length,int* num1,int* num2){*num1 = 0;*num2 = 0;int temp = 0,i;/* 计算200个数的异或和 */for(i=0;i<100;i++){temp ^=(i+1);temp ^=array[i];}int first_not_zero=1;/*找出异或和的最低1的位数*/while(temp%2 == 0){first_not_zero++;temp = temp>>1;}/*按1进行划分*/for(i=0;i<100;i++){if(((1<<(first_not_zero-1))&(i+1)) == 0)*num1 ^=(i+1);else*num2 ^=(i+1);if(((1<<(first_not_zero-1))&array[i]) == 0)*num1 ^=array[i];else*num2 ^=array[i];}}
如有其它更好方法,欢迎讨论!
本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008
0 0
- 找出1-100中缺失的两个数
- [练习题] 找出1-100中缺失的两个数
- 找出数组中缺失的两个数(数组长度为98,数值范围1-100,数值无重复)
- 从1-10000中找出2个缺失的数
- 从1-10000中找出2个缺失的数
- 找出数组中缺失的数
- 找出缺失的数
- 面试100题系列之7找出N个连续的数中缺失的数
- 1到n中减少了一个数,顺序被打乱,找出缺失的数
- 找出1到n缺失的那个数
- 找出两个数中比较大的
- 找出数组中不同的两个数
- 268. Missing Number 找出缺失的数
- 在一堆数中找出最小的两个数
- 找出数组中两个数之和为指定的数
- 找出不同的两个数
- 找出整数数组中两个数差值的绝对值最小
- 找出整数数组中两个数差值的绝对值最小
- LightOJ 1085 All Possible Increasing Subsequences (DP&离散化&树状数组)
- 第一次上机赛解题报告及标程
- POJ 3414
- 快排中划分思想的应用
- Android SDK Manager软件包下载安装相关问题的解决办法
- 找出1-100中缺失的两个数
- 安卓学习笔记之调试
- poj3237 树链剖分
- error:只有静态常量整型数据成员才可以在类中初始化
- Spring集成Quartz定时任务框架介绍和Cron表达式详解
- 基数排序
- 五周 项目1 扩展 计算矩形面积 并判断该矩形是否为正方形
- Unity动态字体文字破碎的解决方法(Dynamic Font Broken)
- Memcached源码分析之LRU操作