原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x21ib6/
解法一:
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (i+1 < nums.length) {
if (nums[i] == nums[i+1]) {
i++;
continue;
}
}
return nums[i];
}
return nums[0];
}
}
思路:因为存在唯一不重复的数组,那么数组长度,肯定是奇数,先将数组进行排序,那么数组中相同的数据必定是相邻的,也只需要判断当前数组元素与下一个元素是否相同,如若不同,那么只出现一次的数字就是当前元素。
解法二(2023-01-12添加):
class Solution {
public static int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
Set<Integer> set1 = new HashSet<>();
for (int num : nums) {
if (set.contains(num)) {
set1.add(num);
}
set.add(num);
}
for (Integer v : set) {
boolean flag = false;
for (Integer v1 : set1) {
if (v.equals(v1)) {
flag = true;
break;
}
}
if (flag) {
continue;
}
return v;
}
return 0;
}
}
思路:这个解法是2023-01-12面试的时候的一道题,题目和上面一样,只是有一点不同,就是重复的数字可能有多个,而不是固定的两个。所以这里解法一就有问题了。这里的思路是使用两个set,一个set保存所有的值,set1保存有重复的值,然后遍历两个set,比较找出set在set1中不存在的那个值就是唯一的值。最后返回即可。
解法三(2023-02-04):
class Solution {
public static int singleNumber(int[] nums) {
int result = 0;
for (int i = 0 ; i < nums.length; i++) {
result ^= nums[i];
}
return result;
}
}
思路:将数组中的所有值进行异或操作,最后留下来的一定是只出现一次的数字。