C++算法之 一个数字只出现一次,其他数字出现3次or N次
来源:互联网 发布:淘宝退货地址 编辑:程序博客网 时间:2024/05/02 01:10
上一个题目利用两个相同的数异或结果为0来计算的,但这个题目中其他数字是出现了3次,因此肯定不可以再使用异或了!
我们换一个角度来看,如果数组中没有x,那么数组中所有的数字都出现了3次,在二进制上,每位上1的个数肯定也能被3整除。如{1, 5, 1, 5, 1, 5}从二进制上看有:
1:0001
5:0101
1:0001
5:0101
1:0001
5:0101
二进制第0位上有6个1,第2位上有3个1.第1位和第3位上都是0个1,每一位上的统计结果都可以被3整除。而再对该数组添加任何一个数,如果这个数在二进制的某位上为1都将导致该位上1的个数不能被3整除。因此通过统计二进制上每位1的个数就可以推断出x在该位置上是0还是1了,这样就能计算出x了。
推广一下,所有其他数字出现N(N>=2)次,而一个数字出现1次都可以用这种解法来推导出这个出现1次的数字。
代码:
// Te.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"int FindNum(int array[], int nLength){int bits[32];memset(bits,0,32*sizeof(int));int i = 0;int j = 0;for (i = 0; i < nLength; i++){for ( j = 0; j < 32; j++){int k = (array[i]>>j) & 1; //与1相与的到结果不是0就是1bits[j] += k;//记录 bits[] 数组当中 0 到 31 位的 值}}int res = 0;for (j = 0; j < 32;j++){if (bits[j]%3 != 0)//例如 2 2 2 1 1 1 9 ,那么bits[0] = 7; bits[2] = 3;bits[4]=1;{res += (1<<j);//得到结果}}return res;}int main(){int b[] = {2,2,2,1,1,1,9};int nLength = sizeof(b) / sizeof(b[0]);printf("%d\n", FindNum(b, nLength));getchar();return 0;}
这个也是要假设你输入的数组是符合要求的!
0 0
- C++算法之 一个数字只出现一次,其他数字出现3次or N次
- [每日练习]一个数组中有一个数字只出现一次,其他数字都出现了偶数次。请找出一个只出现一次的数字
- 其他数字出现3次,x出现一次,输出x
- 在一个长度为n的整形数组a里,除了三个数字只出现一次外,其他的数字都出现了2次。请写程序输出任意一个只出现一次的数字
- 剑指Offer 40题扩展 其他数字出现3次 找出只出现一次的那个 Java实现
- 位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题
- 找出数组中只出现一次/两次/三次的数字,而其他数字都出现偶数次
- 算法面试题:一个数出现一次,其他数出现N次
- 一个整数列,除了一个数字重复2次,所有其他数字都重复4次。O(n)时间O(1)空间找到那个只出现2次的。
- 一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。
- 【算法题】找出两个只出现奇数次的数字
- 一个整数型数组里除了俩个数字之外,其他的数字都出现俩次,求找出这俩个只出现一次的数字
- 找出数组中出现一次两个数,其他数字都出现偶数次
- 在一个数组中除两个数字只出现1次外,其它数字都出现了2次
- 有一个数组,某些数字出现了N次,只有一个出现了M次,求出该数字
- 算法习题61:找出数组中两个只出现一次的数字:一个整型数组里除了两个数字之外,其他的数字都出现了两次
- C++ 算法之 数组中只出现一次的数字
- 算法题目---数组只出现一次数字
- uva 10673
- 中奖问题
- 中奖问题
- ServletResponse注意事项
- 利用jsdoc和idea加速javascript开发(一)
- C++算法之 一个数字只出现一次,其他数字出现3次or N次
- matlab对文件目录路径的操作
- 1009. 说反话 (20)
- 黑马程序员_事件、反射、网络相关知识总结
- Java 中静态变量 静态方法的继承
- MD5算法原理
- 百度面试总结
- 层次查询 Hierarchical Queries 总结
- Matlab和Python操作文件路径的一些函数的比较