题目:给定一个整型数组,其中有两个数字只出现一次,其余的数字都出现两次,找出这两个只出现一次的数字.时间复杂度为O(n),空间复杂度为O(1).异或运算的特性:相等的两个整数异或的结果为0;一个整数与0进行异或运算的结果为其本身.基本思想:将这两个只出现一次的数字分到两个数组中,这样就很容易找到只出...
分类:
编程语言 时间:
2014-11-01 19:07:31
阅读次数:
138
前几天写了一篇文章是在C语言中使用异或运算交换两个任意类型变量,其基础为使用^交换两个整数的算法:a ^= b;b ^= a;a ^= b;如果你看明白这个算法,就会发现这样的规律:一个数异或另一个数两次后,该数保持不变。即: c = a^b; c = c^b; c == a;这一规律就是使用异或运...
分类:
其他好文 时间:
2014-10-27 08:10:45
阅读次数:
164
有一个元素类型是整数的数组,数组中有一个数字仅仅出现了一次,其它都出现了两次,现在请把这个仅仅出现一个找出来。
分析:
1.1 首先想到的是排序,这样的时间复杂度是O(n*logn) + O(n),这样的速度的确不咋地;
1.2 最好的方法不是自己想出的,在网上找到的,是利用位运算的性质,两个相同的数字异或运算的结果是0,0和任何整数的异或运算是其本身,这两点足以,所以我们只需要遍历一边...
分类:
编程语言 时间:
2014-10-27 00:38:31
阅读次数:
162
前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面:void exchange(int&a,int&b){a ^=b;b ^=a;a ^=b;}然而,这里面却存在着一个非常隐蔽的陷阱。通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &...
分类:
其他好文 时间:
2014-10-26 21:13:00
阅读次数:
179
1.逻辑运算和算术运算有什么区别?算术运算就是平常我们所用的加减乘除,而逻辑运算是在二进制位上进行非、与、或和异或运算,逻辑运算中的二进制位只有两种状态:0(假)和1(真),结果中的二进制位也只有这两种状态。4.解释“溢出”这个词。 当我们进行计算机数字中的算术运算时,要记住每个数字和结果应该在分配...
分类:
其他好文 时间:
2014-10-26 15:31:58
阅读次数:
912
有两个变量 a 和 b ,交换这两个变量的值方法一 使用中间变量void swap(int *a, int *b){ int temp = 0; temp = *a; *a = *b; *b = temp; }方法二 不适用任何中间变量 ① 异或运算法void swap...
分类:
其他好文 时间:
2014-10-26 13:05:02
阅读次数:
149
http://acm.hdu.edu.cn/showproblem.php?pid=4768
貌似很多人是用的二分
但是更好的做法貌似还是异或
对于第k个人,如果他接到偶数个传单,那么异或的结果还是0
就是说op记录所有收到传单的人次的总的异或值,那么因为只有一个是收到奇数次,所以异或值就是他的编号,至于收到几次,在O(n)可以计算
//#pragma comment(linker, "...
分类:
其他好文 时间:
2014-10-22 14:40:51
阅读次数:
171
第一种方法:1 int a = 3;2 int b = 5;3 a = a + b;4 b = a - b;5 a = a - b;缺点:a和b是很大的数的话容易溢出。第二种方法:int a = 3;int b = 5;a = a ^ b;b = a ^ b;a = a ^ b;"^"是异或运算,这...
分类:
其他好文 时间:
2014-10-21 21:28:25
阅读次数:
154
这篇文章中将使用C语言,实现交换两个任意类型变量的功能.有人认为异或运算只能用于整数类型的交换,实际上异或运算是针对二进制的.既然计算机所有的数据类型都是以二进制进行保存的,那么当然可以用异或运算交换任何数据类型.
分类:
其他好文 时间:
2014-10-21 15:22:37
阅读次数:
148
首先有两个自定的转换函数: function myStrToHex(s:string):string; //字串转16进制 var TmpStr:string; i:integer; begin TmpStr:=''; for i:=1 t...