只出现一次的数字 II(哈希、位操作、逻辑电路、有限状态自动机)

只出现一次的数字 II

题目链接
题目描述
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素

方法1:哈希

思路

  1. 建立一个数字用来映射次数
  2. 遍历拿出次数次数为1的

方法2:位操作

思路

  1. 以[2,2,3,2]为例:
  2. 由于其他数都是3个,把每个数的每个位二进制的之和填入32个元素的数组
  3. 遍历%3,得到的就是那个数
    在这里插入图片描述

代码如下:

class Solution {
public:
   int singleNumber(vector<int>& nums) {   
       vector<int> bit_arr(32,0);
       for(int i=0;i<nums.size();i++)
       {
           int bit=32;
           while(bit--)
           {
               bit_arr[bit]+= (1&(nums[i]>>bit));
           }
       }

       int ret=0;
       for(int i=0;i<32;i++)
       {
           if(bit_arr[i]%3==1)
           {
               ret|=(1<<i);//例如左移3位 0000001000,按位或达到效果
           }
       }
       return ret;
   }
};

方法3:逻辑电路

参考 :官方解题思路

方法4:有限状态自动机

参考: Krahets的解题思路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值