1. 初级版
描述:一个整型数组里除了1个数字之外,其他的数字都出现了两次,请写程序找出这个只出现一次的数字。
思路:利用异或的特性,x^y^x=x^x^y=y。对数组所有元素进行一次异或操作,最后得到的就是只出现一次的数字。
1.1变化版
描述:一个整型数组里除了2个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现1次的数字。
思路:
1. 两个数字肯定是不同的,则必有某一位上,两个数字是不同的;
2. 可以对数组所有元素进行一次异或操作,得到两个数字哪一位是不同的;
3. 然后根据这一位将整个数组分为两个数组,则两个数会分在不同的数组,并且相同的数一定会分在同一个数组;
4. 之后利用异或的方式得到数字。
2. 进阶版
描述:一个整型数组里除了1个数字之外,其他的数字都出现了三次,请写程序找出这个只出现一次的数字。
思路:最基本的工具还是利用异或的特性,但在使用方法上要做一些改变。
用两个数字s1,s0记录每一位1的个数(s1为高位数,s0位低位数),如果等于3(即011)则置零。设s1_k为高位数的第k位、s0_k为低位数的第k位,A_k为其中一个数的第k位:
则满足:
输入 |
输出 |
|
|||
S1_k |
S2_k |
A_k |
S1_k |
S2_k |
|
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
1 |
0 |
1 |
|
0 |
1 |
0 |
0 |
1 |
|
0 |
1 |
1 |
1 |
0 |
|
1 |
0 |
0 |
1 |