ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法:数组中数字出现的次数

2022-08-04 21:32:08  阅读:145  来源: 互联网

标签:数字 nums int 复杂度 ret 次数 算法 数组 div


问题

  • 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

解决


//1、利用hashset的特性进行判断
class Solution {
    public int[] singleNumbers(int[] nums) {
         int len1=nums.length;
         if(len1==2) return nums;
         
        HashSet<Integer> set=new HashSet<Integer>();
        
        // for(int i=0;i<len1;i++){
        //     if(!set.contains(nums[i])){
        //         set.add(nums[i]);
        //     }else{
        //         set.remove(nums[i]);
        //     }
        // }
        int left=0,right=len1-1;
        while(left<=right){
           if(nums[left]==nums[right]){
               left++;
               right--;
               continue;
           }
           if(!set.contains(nums[left])){
               set.add(nums[left]);
           }else {
                set.remove(nums[left]);
           }
           if(!set.contains(nums[right])){
               set.add(nums[right]);
           }else{
                set.remove(nums[right]);
           }
           left++;
           right--;
        }


        int[] arr=new int[2];
        int a=0;
        for(int j:set){
            arr[a++]=j;
        }
        return arr;
    }
}


//2、通过异或操作获取值
class Solution {
    public int[] singleNumbers(int[] nums) {
        int ret = 0;
        for (int n : nums) {    //得到两个子出现1次的值的异或值:此时结果中的位上的1表示两数原本位置上是不同的值
            ret ^= n;
        }
        int div = 1;
        while ((div & ret) == 0) {      //提取出最右边的1
            div <<= 1;        //将1左移一位,=》0010。。。从而得到ret最右边的1     
        }
        int a = 0, b = 0;
        for (int n : nums) {        //能够将两个出现1次的分到不同的两组(因为他们在div对应得位置不同),相同的数分到一组(在div对于得位置上相同)!
            if ((div & n) != 0) {           //第一组
                a ^= n;
            } else {
                b ^= n;                     //第二组
            }
        }
        return new int[]{a, b};
    }
}


总结

  • 第二种方式更优

标签:数字,nums,int,复杂度,ret,次数,算法,数组,div
来源: https://www.cnblogs.com/zhangsanM/p/16552371.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有