数组中数字出现的次数

2021-01-30 23:18

阅读:472

标签:==   get   ber   http   amp   ash   pre   return   numbers   

? 技术图片
技术图片

第一次解题思路:

  • 遍历数组,将数字和出现的次数装到map集合
  • 遍历map集合,取到题目要求值 (其实不能用Map(空间复杂度O(n)))
public int[] singleNumbers(int[] nums) {
        Map map=new HashMap();
        for(int num:nums){
            if(map.containsKey(num)){
                map.put(num,map.get(num)+1);
            }else{
                map.put(num, 1);
            }
        }
        int [] ans=new int[2];
        int count=0;
        for(Map.Entryentry:map.entrySet()){
            if(entry.getValue()==1){
                ans[count++]=entry.getKey();
            }
        }
        return ans;
   }

技术图片
技术图片

优化

解题思路:分组位运算

? 题目要求时间复杂度O(n),空间复杂度为O(1),因此不能用map(空间复杂度O(n))

? 技术图片
技术图片

代码如下:

//使用分组位运算
    public int[] singleNumbers3(int[] nums) {
       //因为只有两个数出现一次,数组全部元素进行异或运算的值 等同于 这个两个元素异或运算的值
        int k=0;
        for(int num:nums){
            k^=num;
        }

        //两个数异或值不等于0 说明什么?说明这两个数不同 那这两个数在哪一位不同 对应位的异或值为1的地方不同
        //两个不同的数异或运算的结果 k  对k从低位往高位寻找 两个数某位不同的所在位置  (即k从最低位开始 首次出现‘1‘的位置)
        //找到区分值,就可以将这两个数 分到 两个不同分组
        int first=1;
        while((first&k)==0){
            first

技术图片
技术图片

数组中数字出现的次数

标签:==   get   ber   http   amp   ash   pre   return   numbers   

原文地址:https://www.cnblogs.com/yh-simon/p/12818844.html

上一篇:Java中的目录操作

下一篇:JavaScript事件


评论


亲,登录后才可以留言!