题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
解法
自己的解法
思路:双重for循环遍历,细节需要注意,比如到达最后一个数的处理逻辑、两层循环m!=n
package com.jzj.study.learn0527;
/**
*
*/
public class LC_OneHappen {
public static void main(String[] args) {
int[] nums = new int[9];
nums[0] = 2;
nums[1] = 2;
nums[2] = 1;
nums[3] = 3;
nums[4] = 4;
nums[5] = 4;
nums[6] = 6;
nums[7] = 1;
nums[8] = 3;
System.out.println(singleNumber(nums));
}
public static int singleNumber(int[] nums) {
int result = 0;
for (int m = 0; m < nums.length; m++) {
if (m == nums.length - 1) {
return nums[m];
}
for (int n = 0; n < nums.length; n++) {
if (m == n) {
continue;
}
if ((n == nums.length - 1) && (nums[m] != nums[n])) {
result = nums[m];
return result;
}
if (nums[m] == nums[n]) {
System.out.println("num[" + m + "]" + "== nums[" + n + "].value " + nums[m]);
break;
}
}
}
return result;
}
}
正确解法
采用异或运算,因为他们每个数字都是出现2次,只有一个出现1次,异或满足交换律
任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0=a
任何数和其自身做异或运算,结果是 00,即 a ⊕ a=0
异或运算满足交换律,看下面
12 ⊕ 7 ⊕ 12 ⊕ 11 ⊕ 10 ⊕ 11 ⊕ 10
= 12 ⊕ 12 ⊕ 11 ⊕ 11 ⊕ 10 ⊕ 10 ⊕ 7
= 0 ⊕ 0 ⊕ 0 ⊕ 7
= 0 ⊕ 0 ⊕ 7
= 0 ⊕ 7
=7
代码
package com.jzj.study.learn0527;
/**
*
*/
public class LC_OneHappen2 {
public static void main(String[] args) {
int[] nums = new int[9];
nums[0] = 2;
nums[1] = 2;
nums[2] = 1;
nums[3] = 3;
nums[4] = 4;
nums[5] = 4;
nums[6] = 6;
nums[7] = 1;
nums[8] = 3;
System.out.println("--------->" + eh(nums));
}
public static int eh(int[] nums) {
int result = 0;
for (int i = 0; i < nums.length; i++) {
result = result ^ nums[i];
}
return result;
}
}