找出一个数组唯一一个出现2次的数字
来源:互联网 发布:sm8952ac25pp编程软件 编辑:程序博客网 时间:2024/05/01 11:51
题目描述:一个N个元素的数组,存储1 - N-1的数字,其中只有一个数字重复出现,找出那个重复的数字;要求时间空间效率高。
这个题有个隐含的规律,所有的数字都是连续的,说明啥?可以求和啊!
于是解法一:先对N个元素求和为sum,设重复元素为a(1<=a<=N-1),那么sum也等于1+2+...+N-1 + a,欲求a,只需用sum一次减去1-N-1即可了:
int find(int * array,int len){ if(array == NULL ) exit(); int sum =0; int i; for(i=0;i<len;i++) { sum +=array[i]; } for(i=1;i<len;i++) { sum -= i; } return sum;}
该函数还可以优化:
int find(int * array,int len){ if(array == NULL ) exit(); int sum = 0; int i; for(i=0;i<len;i++) { sum += (array[i] - i); } return sum;}解法二:既然该函数只有一个重复出现,那么可不可以用异或呢,答案是肯定的,其实和求和的思想一样,先把数组元素异或,那么是不是就得到了剩下除去a的N-2个元素异或值,那么在一次异或1-N-1,是不是就把N-2个重复元素过滤掉了,就只剩下a了:
int find(int * array,int len){ if(array == NULL ) exit(); int xor =0; int i; for(i=0;i<len;i++) { xor ^= (array[i] ^ i); } return xor;}
这样两个解法时间复杂度都是O(n),空间复杂度为O(1),应该算高效了!
欢迎大家补充其他想法,最好是时间复杂度都是O(n),空间复杂度为O(1)。谢谢!
- 找出一个数组唯一一个出现2次的数字
- 互联网面试题:一个数组中找出三个出现奇数次的数字中的一个
- 互联网面试题:一个数组中找出三个出现奇数次的数字中的一个
- [每日练习]一个数组中有一个数字只出现一次,其他数字都出现了偶数次。请找出一个只出现一次的数字
- 一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?
- 在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字
- 整数数组,一个数字出现了半数以上次,找出这个数字
- 一个整数型数组里除了俩个数字之外,其他的数字都出现俩次,求找出这俩个只出现一次的数字
- 找出数组中唯一出现k次的元素x
- 找出一个数组中各个数字出现的次数
- 一个整数数组,每个数字都出现K次,只有一个数字出现M次,找出这个数字(线性时间)
- 数组中,一个数出现一次,其余的数都出现2次,找出那个出现一次的数
- 一个简单的实现找出数组中一个数字出现次数最多的数字的算法
- 一个简单的算法---实现找出数组中一个数字出现次数最多的数字
- 一个简单的算法---实现找出数组中一个数字出现次数最多的数字
- 找出数组中唯一出现一次的两个数字
- 数组中一个数字出现的次数超过了数组长度的一半,找出这个数字
- 数组中一个数字出现的次数超过了数组长度的一半,找出这个数字
- Python 资源索引[绝对适合PYTHON人]
- iphone开源应用源代码下载
- 不懂技术的人不要对懂技术的人说这很容易实现
- google analytics
- android上的一个网络接口和图片缓存框架enif
- 找出一个数组唯一一个出现2次的数字
- debian 设置静态IP
- 基于jQuery焦点图片新闻代码(JS+CSS)
- Smallest x86 ELF Hello World
- centos 安装 php php-fpm
- 程序员必读:JavaBean规范
- POJ3710
- 女人看了是自省,男人看了是激励
- 2012.11.22