力扣练习之只出现一次的数字

我爱海鲸 2023-02-04 23:55:51 初级算法

简介初级算法

原题出处: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;
    }
}

思路:将数组中的所有值进行异或操作,最后留下来的一定是只出现一次的数字。

你好:我的2025