首页 > 编程语言 > 详细

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

时间:2020-07-08 09:50:20      阅读:65      评论:0      收藏:0      [点我收藏+]

力扣链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/

题目描述

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

  • 1 <= nums.length <= 10000
  • 1 <= nums[i] < 2^31

 

思路:位运算+逐位统计

如果去掉只出现一次的数字,统计每一位上1和0出现的次数,则一定都可以被3整除。因此只要统计0或1在每一位出现的次数,如果该次数除以3余1(一定只余1),就说明落单的数这一位是1。

步骤:

  1. 初始化count=0,res=0。对 i=0~31:
  2. 对数组中每一个元素,统计第i位是否为1,是则count++
  3. 若count%3===1,res += 2^i
  4. 得到的res即为只出现一次的数字

 

代码:

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let res = 0;
    for(let i = 0; i < 32; i++){
        let count = 0;
        for(let num of nums){
            if(num & (1<<i)){
                count++;
            }
        }
        
        if(count % 3 === 1){
            res += Math.pow(2, i);
        }
    }
    
    return res;
    
};

时间复杂度:O(N)

空间复杂度:O(1)

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

原文:https://www.cnblogs.com/xintangchn/p/13264783.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!