找出一个整形数组的所有元素除了一个、两个、三个元素外,其余全是成对出现的,找出这些元素
2013-12-09 22:53
459 查看
这是常见的一种面试题,其关键思想是利用位操作的异或,同数异或为0, 而0和任何数异或都是它本身:
0^1 = 1; 0^0 = 0; 1^1 = 0;而且满足交换律和结合律
对于只有一个元素不成对的值,只要将数组的每一个元素都异或操作,结果就是那个不成对的元素
对于有两个不成对的元素,则要将这两个元素分到不同的两个数组中,而且每个数组的其他元素都是成对的,则对这两个数组分别利用上面的求一个不成对的元素的方法即可。关键是怎么分组。
对于数组a[] = {1,2,3,4,5,3,2,1} 每个元素都异或之后,结果其实就是这两个不成对的元素4和5异或的结构:4^5=1 对于结果1, 第一位是1,和5(101)一样,而4( 100 )的第一位则是0,这样就可以区分这两个元素,其他元素也按第一位是否为1分类:
1 : 000
2:010
3:011
4:100
5;101
所以1,1,2,2,4分到一组, 3,3, 5分到一组。
这里要注意位运算符和比较运算符的优先级,( a[i] & bits ) == 0; 这里==的优先级高,在这里纠结了半天才找到,哎
0^1 = 1; 0^0 = 0; 1^1 = 0;而且满足交换律和结合律
对于只有一个元素不成对的值,只要将数组的每一个元素都异或操作,结果就是那个不成对的元素
int FindOne( int a[], int len) { int ret = -1; int i = 0; ret = a[0]; for(i=1; i < len; i++) { ret = ret ^ a[i]; } return ret; }
对于有两个不成对的元素,则要将这两个元素分到不同的两个数组中,而且每个数组的其他元素都是成对的,则对这两个数组分别利用上面的求一个不成对的元素的方法即可。关键是怎么分组。
对于数组a[] = {1,2,3,4,5,3,2,1} 每个元素都异或之后,结果其实就是这两个不成对的元素4和5异或的结构:4^5=1 对于结果1, 第一位是1,和5(101)一样,而4( 100 )的第一位则是0,这样就可以区分这两个元素,其他元素也按第一位是否为1分类:
1 : 000
2:010
3:011
4:100
5;101
所以1,1,2,2,4分到一组, 3,3, 5分到一组。
int FindTwo(int a[], int len) { int ret = -1; int i = 0; int j = 0; int k = 0; int bits = 1; int result1 = 0; int result2 = 0; ret = a[0]; for(i=1; i < len; i++) { ret = ret ^ a[i]; } //求取第一个为1的位 while(1) { if( (ret & bits) == 0) { bits = bits << 1; } else { break; } } //将每一个元素按bits的位为1的位分类 for(i=0; i < len; i++) { if( (a[i] & bits) == 0) //改位不为1 { result1 = result1 ^ a[i]; } else //该位为1 { result2 = result2 ^ a[i]; } } printf("result1 = %d \n", result1); printf("result2 = %d \n", result2); return ret; }
这里要注意位运算符和比较运算符的优先级,( a[i] & bits ) == 0; 这里==的优先级高,在这里纠结了半天才找到,哎
相关文章推荐
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一个数组中除了两个数字之外,其余数字都出现了两次,找出这两个数字
- 一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。
- 一个数组中,除两个元素其余都出现了两次,找出这两个元素
- 一个数组中,除两个元素其余都出现了两次,找出这两个元素
- 一个数组中,除两个元素其余都出现了两次,找出这两个元素
- 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
- 一个数组中只有两个数字是出现一次,其他所有数字都成对出现,找出这两个数字,编程实现
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 在一个数组中找出只出现一次的一个数字、两个数字,而其余数字全部成对出现。
- 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
- 一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个
- 一个数组中除了三个数字之外,其余数字都出现了两次,找出这三个数字
- 一个数组有除了两个元素只出现一次,其他元素全部都出现了两次,请找出只出现一次的两个元素,并输出
- 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- 数组中唯一出现一次的一个,两个,三个数,其余数都是偶数次出现(java版本)