题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。我们想到异或运算的一个性质:任何一个数字异或它自己都等于0。也就是说, 如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。...
分类:
编程语言 时间:
2015-07-06 12:21:17
阅读次数:
139
题目意思:一个数值数组中,大部分的数值出现两次,只有一个数值只出现过一次,求编程求出该数字。
要求,时间复杂度为线性,空间复杂度为O(1).解题思路:1.先排序,后查找。由于排序的最快时间是O(nlogn), 所以这种方法不能满足时间的要求。2.其它技巧来解决:根据基本的计算机组成原理的知识,采用”异或运算“来巧妙的完成,异或运算很简单:0^0=0
1^1=0
1^0=0^1=1也就是说相同则...
分类:
编程语言 时间:
2015-07-03 00:19:15
阅读次数:
183
异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。异或的性质交换律:a ^ b = b ^ a结合律:a ^ b ^ c = a ^ (b ^...
分类:
其他好文 时间:
2015-06-30 20:15:23
阅读次数:
154
在一个长度为n的整形数组a里,除了三个数字只出现一次外,其他的数字都出现了2次。请写程序输出任意一个只出现一次的数字,程序时间和空间复杂度越小越好。 例如: a = {1,3,7,9,5,9,4,3,6,1,7},输出4或5或6。解题思路
如果只有一个只出现一次,将所有数做异或运算,返回其值。
如果有两个数只出现一次,假设为a和b,全部数做异或运算的结果为x=a^b,由于a和b不相等,所以x不为0。...
分类:
移动开发 时间:
2015-06-23 20:09:43
阅读次数:
149
题目意思:一个int数组,有一个数只出现一次,其他数均出现两次,找到这个唯一数知识普及:~:非运算,单目运算符1为0,0为1; &:与运算,都为1则为1,否则为0 |:或运算,全为0则为0,否则为1 ^:异或运算,相同为0,不同为1思路:将数组中元素进行异或运算,则只剩下0...
分类:
其他好文 时间:
2015-06-12 11:31:24
阅读次数:
102
找出101个数据中重复的元素
* 题目如下:现有0到99,共计100个整数,各不相同,将所有数放入一个数组,随机排布。
* 数组长度101,多余的数字是0到99其中任意一个数(唯一重复的数字)
* 请将这个重复的数字找出来
这道题有三种方式:第一种用交换排序找出,第二种求数组的和再减去0-99,第三种异或运算求出...
分类:
编程语言 时间:
2015-06-08 10:01:03
阅读次数:
203
前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面:void exchange(int&a,int&b){a ^=b;b ^=a;a ^=b;}然而,这里面却存在着一个非常隐蔽的陷阱。通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &...
分类:
其他好文 时间:
2015-06-02 12:59:01
阅读次数:
128
本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗?关于这个问题,网络上面有很多的解释,3种方法,我这里给比较一下各自的优缺点,然后简单分析一下汇编代码,分析代码如下:#include void swap1(int &a,int &b){...
分类:
其他好文 时间:
2015-05-31 22:50:50
阅读次数:
214
异或^符号,在平时的学习时可能遇到的不多,不过有时使用得当可以发挥意想不到的结果。值得注意的是,异或运算是建立在二进制基础上的,所有运算过程都是按位异或(即相同为0,不同为1,也称模二加),得到最终结果。特点:任何数和0异或都等于它本身;两个相同的数异或后的结果是0;举例如下:int a = 4 =...
分类:
编程语言 时间:
2015-05-27 00:39:55
阅读次数:
150