华为机试——找出数组中不同的数字

已知数组中数字都两两相同,只有一个不同,找出该数字

这里提供三种方法,前两种比较容易想到,第三种需要了解异或运算。

题解一(时间复杂度高)

思路:两层for循环,如果一个数没有遍历到与自己相同的数,则返回这个数。否则,结束循环,换下一个数继续遍历。
时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(1)

题解二(空间复杂度高)

思路:使用字典,如果字典key中不包含该数字,则添加到字典中,否则移除该key-value(任意值,用不到),最后字典中仅剩下一个key-value,输出该key。
时间复杂度:O(n)
空间复杂度:O(n)

题解三(最优)

思路:使用异或运算。如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0(这里a、b指0或1)。异或有一个重要的特点,0异或一个数结果仍然是那个数。那么根据异或的这种特性,我们不妨来分析一下,有数组[1,2,3,4,3,2,1],对数组遍历,逐个异或,由于1,2,3两两相同最后都为0,最后0异或4等于4,就很容易的得到了结果。(下一篇文章进阶题目:找出数组中不同的两个数字)

swift代码:

func findDifferentNum(_ array: [Int]) -> Int{
    
    
	var res = 0
	for i in 0..<array.count{
    
    
		res = res ^ array[i]
	}
	return res
}

时间复杂度:O(n)
空间复杂度:O(1)

猜你喜欢

转载自blog.csdn.net/weixin_44758107/article/details/127633719