题解 | 数组中只出现一次的数(其它数出现k次) 哈希表/位运算

题目描述

哈希表

看到题目的第一反应就是用哈希表,在c++中是unordered_map。

这里用了一个小技巧,当某个数出现k次后,从哈希表中删除,这样最后哈希表中只会剩下一个数,就是答案。

时间复杂度O(n),空间复杂度O(n)。

#include <unordered_map>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        unordered_map<int, int> mp;
        for(int &i : arr) {
            if(++mp[i] == k) mp.erase(i);
        }
        return mp.begin()->first;
    }
};

位运算

哈希表的一个问题是空间复杂度比较大,当数据量增加的时候,会出现哈希冲突,导致时间复杂度急剧上升。使用位运算可以很好解决这个问题。

注意,数组中只有一个数字出现一次,设为ans,其他所有数字都出现k次。那么将数组中的每个数字看成一个二进制数。由于int是32位的数据类型,所以针对其每一位做一个求和,再对k取余数,就得到了ans在该位的值。

时间复杂度O(32n),空间复杂度O(1)。

#include <unordered_map>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param arr int整型vector
     * @param k int整型
     * @return int整型
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int sum = 0;
            for (int& x : arr) {
                if (x & 1) ++sum;
                x >>= 1;
            }
            if(sum % k) ans += 1 << i;
        }
        return ans;
    }
};
全部评论

相关推荐

09-16 14:43
已编辑
江娱互动_研发_客户端开发
背景&nbsp;双一流本硕&nbsp;双非大圆满&nbsp;只找游戏开发相关的岗位。&nbsp;8&nbsp;月初开始秋招到现在&nbsp;投了四五十家吧,&nbsp;目前两&nbsp;offer,&nbsp;不打算继续投了,把剩下的流程走完就开始沉淀了。目前两&nbsp;offer&nbsp;一个是网易互娱测开&nbsp;base&nbsp;广州,一个是江娱互动客户端开发&nbsp;base&nbsp;北京。应该确定网易这个了,说实话北京这个我挺想去的,这家的产品和工作氛围我了解了也不错,是那种踏实做事的,可惜我是广东人。网易的测开是调剂的二志愿,看了下有内部转岗机会,所以打算后面找个时间提前实习,沉淀下再做一个&nbsp;demo&nbsp;作品,写一些&nbsp;shader,增强下图形学渲染的能力,再学点编辑器开发。看到时候内部转岗或者春招继续投客户端开发这样。后面还能再动摇的话应该就灵犀或者腾子了吧(假如这两家确认的是客户端开发岗的话)。-----------------------补下timeline网易互娱&nbsp;测开&nbsp;8.2笔试&nbsp;&nbsp;8.21&nbsp;技术面&nbsp;&nbsp;8.29&nbsp;leader&amp;HRBP面(终面)&nbsp;9.8&nbsp;录用审核(之前一直显示面试中)9.14&nbsp;oc江娱互动&nbsp;客户端开发&nbsp;8.29主程面&nbsp;9.3&nbsp;制作人面&nbsp;9.5&nbsp;BOSS面&nbsp;9.11&nbsp;口头OC&nbsp;9.15&nbsp;正式offer后面考虑了一下&nbsp;&nbsp;感觉还是能走开发就开发吧,测开不太感兴趣,要内部活水转岗还要满1年才能申请。。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务