剑指 Offer 56 - II. 数组中数字出现的次数 II

100 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

剑指 Offer 56 - II. 数组中数字出现的次数 II

Leetcodeleetcode.cn/problems/sh…

GitHub : github.com/nateshao/le…

剑指 Offer 56 - II. 数组中数字出现的次数 II

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

示例 1:

 输入:nums = [3,4,3,3]
 输出:4

示例 2:

 输入:nums = [9,1,7,9,7,9,7]
 输出:1

思路:hashmap

     /**
      * hashmap
      *
      * @param nums
      * @return
      */
     public int singleNumber(int[] nums) {
         HashMap<Integer, Integer> map = new HashMap<>();
         for (int i = 0; i < nums.length; i++) {
             Integer a = map.getOrDefault(nums[i], 0);
             map.put(nums[i], a + 1);
         }
         for (Integer a : map.keySet()) {
             if (map.get(a) == 1) return a;
         }
         return -1;
     }

位运算

 public int singleNumber2(int[] nums) {
     int ones = 0, twos = 0;
     for(int num : nums){
         ones = ones ^ num & ~twos;
         twos = twos ^ num & ~ones;
     }
     return ones;
 }

滑动窗口

 func singleNumber(nums []int) (ans int) {
    var left int
    mp := make(map[int]int)
    for i := 0; i < len(nums); i++ {
       mp[nums[i]]++
       for mp[nums[left]] == 3 {
          left++
       }
    }
    return nums[left]
 }

\