原题目:
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
题目大意就是说 有一个int类型的数组,里面的数字都出现了两次,只有一个数字除外。
然后在加了一个额外的条件,就是你的算法能否尽量减小内存开销。
我们先看比较传统的两种做法,再看一个 leetcode 上某位大神的做法。
1. 直接两次循环来统计出现次数的方法。
public int singleNumber(int[] nums) { for(int i=0;i<nums.length;i++) { int count=0; for(int j=0;j<nums.length;j++) { if (i == j) { continue; } if (nums[i] == nums[j]) { count++; break; } } if (count == 0) { return nums[i]; } } return 0; }
2.先将数组进行排序,那么每个数就只需要和它后面的一个进行比较。如果不相同即那个数是单独的。
public int singleNumber(int[] nums) { Arrays.sort(nums); int i=0; int result=0; while (true) { if (i == nums.length - 1|| nums[i] != nums[i+1] ) { result = nums[i]; break; } i+=2; } return result; }
3.这个是leetcode 上的 大神写的,主要思路采用了 异或, 两个相同的数字进行异或的值是0,那么单独的那个数就剩余下来了
比如: [ 1,1,2 ] = ( (1^1) ^2 ) = 2
public int singleNumber(int[] nums){ int result = 0; for(int i=0;i<nums.length;i++) { result ^= nums[i]; } return result; }该算法原文