题目描述:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

  1. 输入: [2,2,1]
  2. 输出: 1

示例 2:

  1. 输入: [4,1,2,1,2]
  2. 输出: 4

算法实现:

暴力法

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var singleNumber = function(nums) {
  6. for (var i = 0; i < nums.length; i++ ) {
  7. if (nums.indexOf(nums[i]) === nums.lastIndexOf(nums[i])) {
  8. return nums[i]
  9. break
  10. }
  11. }
  12. };

异或法

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var singleNumber = function(nums) {
  6. var temp = 0
  7. for (var i = 0; i < nums.length; i++ )
  8. temp ^= nums[i]
  9. return temp
  10. };

思考:

暴力法易于想到,只需要比较最初出现数字的索引和最后的索引是否相同即可,但时间复杂度很高。异或法采用位运算的方式,由于位运算具有两个相同的数异或操作后为0,一个数字和0异或运算后为本身的性质,所以最终的结果即为那个没有相同数字的数字。

总结:

异或法学习了。