• 牛客题霸NC75数组中只出现一次的数字Java题解


    牛客题霸NC75数组中只出现一次的数字Java题解

    https://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=117&&tqId=34997&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

    方法1:分组异或
    解题思路:先将数组中所有的数做异或(相同为0,相异为1),可以得到这两个不相同数的异或。对于异或后的结果(二进制)从右往左数一定有一位为1,这一位就可以用来区分这两个不相同的数。利用mask获得异或结果中最低的一位1,这样就可以进行分组,然后这两个不同的数一定会被分到不同的组中,其他相同的数一定会被分到同组,再对同组内做异或,就可以得到这两个不同的数了。

    //num1,num2分别为长度为1的数组。传出参数
    //将num1[0],num2[0]设置为返回结果
    public class Solution {
        public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
            int k = 0;
     
            for(int num: array) {    //将所有的数做异或
                k ^= num; 
            }
     
            int mask = 1;     
     
            //获取mask,用于分组( 获得k中最低位的1(可以区分两个不同数的那一位))
            while((k & mask) == 0) {  
                mask <<= 1;
            }
     
            for(int num: array) {           //分组
                if((num & mask) == 0) {  
                    num1[0] ^= num;         //组内做异或
                } else {
                    num2[0] ^= num;         //组内做异或
                }
            }
     
        }
    }

    方法2:HashMap
    解题思路:利用HashMap存储数组中每个数字及出现的次数,再通过遍历数组和HashMap查找出出现次数为1的两个数。

    import java.util.*;
    //num1,num2分别为长度为1的数组。传出参数
    //将num1[0],num2[0]设置为返回结果
    public class Solution {
         public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
             HashMap<Integer,Integer> map = new HashMap<>();  //利用HashMap存储数组中每个数字及出现的次数
     
             for(int i = 0;i<array.length;i++){    //将数组中的值和出现次数保存到HashMap中
                 if(map.containsKey(array[i])){
                     map.put(array[i],2);
                 }else{
                     map.put(array[i],1);
                 }
             }
     
             boolean flag = false;       //设置标志,如果遍历出次数为1的数,就将其设为true
             for(int j=0;j<array.length;j++){   //遍历数组array
                 if(map.get(array[j])==1){      //如果当前数字出现的次数为1
                     if(flag==false){              //如果之前没出现过次数为1的数,则将其保存到num1[0]中
                         num1[0] = array[j];
                         flag = true;
                     }else{                   //如果已经出现过次数为1的数,则将其保存到num2[0]中
                         num2[0] = array[j];
                     }
                 }
             }
         }
    }
  • 相关阅读:
    Linux下的文件权限
    启动memcached服务器并检查memcached是否启动,关闭memcached
    MySQL的mysqldump工具的基本用法
    MemAdmin
    不同服务器数据库之间的数据操作
    公用js
    AspNetPager分页控件的使用
    平台帮助
    触发器、游标
    jQuery增删改查
  • 原文地址:https://www.cnblogs.com/yunfeiyang2020/p/14038273.html
Copyright © 2020-2023  润新知