题目1:
一个整型数组里除了1个数字出现 奇数次 外,其他数字都出现 偶数次 ,请找出 只出现奇数次的 这个数。
要求: 时间复杂度 O(n) ,空间复杂度 O(1)。
解题思路:
1、我们知道 2个相同的数异或的结果为0, 所以我们将这n个数从头到尾 异或一遍得到结果x
2、于是乎,我们便得到了结果……
题目2:
一个整型数组里除了两个数字出现 奇数次 外,其他数字都出现 偶数次 ,请找出 只出现奇数次的 这两个数。
要求: 时间复杂度 O(n) ,空间复杂度 O(1)。
解题思路:
根据题目1,我们可以想到,能不能将这两个数分开呢……
1、我们将这n个数从头到尾 异或一遍得到结果x(假设这两个数为a和b, 则a^b == x)
2、找到x的二进制表示中不为0的某一位,位置为y,然后将这n个数分成两类:y位置为1和y位置为0
3、将这两类数分别异或得到两个数a1和b1,便是我们所要求得结果
{
首先出现奇数次的这两个数肯定是不相等的,
所以两个出现奇数次的数在y位置上的二进制表示肯定是不同的,
否则y位置的结果不可能为1。
这样便将这两个数分开了。
又因为,每一类数中的其他数异或之后肯定为0,
所以,便得到结果啦……
}
题目3:
给你1到n这n个数,无序,现将其中一个数x改变成y,找出这两个数
要求: 时间复杂度 O(n) ,空间复杂度 O(1)。
解题思路:
刚开始想排序,不过O(n)的复杂度,很难(⊙o⊙)哦 ,根据上一题,可以这么考虑:
相当于我们有了两个数组,题目中所给的一个和从1到n这个有序的数组,然后就跟上一题一样~\(≧▽≦)/~啦啦啦
1、求出1到n的异或值x
2、继续将x与题目中所给的所有数值异或,得到新的x
3、根据x的二进制表示中不为0的某一位置y,然后将这n*2个数分成两:y位置为1和y位置为0
4、将这两类数分别异或得到两个数a和b,便是我们所要求得结果