• 剑指 Offer 56 I. 数组中数字出现的次数


    class Solution {
        public int[] singleNumbers(int[] nums) {
            Arrays.sort(nums);
            int i = 1,j = 0;
            int c = 0;
            ArrayList<Integer> list = new ArrayList<>();
            while(i<nums.length){
                if(nums[i] != nums[j]){
                    c++;
                    list.add(nums[j]);
                    j = i;
                    i++;
                }else{
                    i+=2;
                    j+=2;
                    if(j == nums.length-1){
                        c++;
                        list.add(nums[j]);
                        break;
                    }
                }
            }
            int[] res = new int[c];
            for(int k = 0;k<c;k++){
                res[k] = list.get(k);
            }
            return res;
        }
    }


    位分组

    public int[] singleNumbers(int[] nums) {
            int n = nums.length;
            int res = nums[0];
            int i = 1;
            while(i<n){
                res = (res^nums[i++]);
            }
            //将res转换为二进制数
            String s = Integer.toBinaryString(res);
            int j = s.length()-1;
            while (j>=0){
                if(s.charAt(j) == '1'){
                    break;
                }else{
                    j--;
                }
            }
            int j1 = s.length()-1-j;
            ArrayList<Integer> list1 = new ArrayList<>();
            ArrayList<Integer> list2 = new ArrayList<>();
            for (int num : nums) {
                String s1 = Integer.toBinaryString(num);
                if(s1.length() - 1 - j1<0){
                    list2.add(num);
                }else {
                    char c = s1.charAt(s1.length() - 1 - j1);
                    if (c == '1') {
                        list1.add(num);
                    } else {
                        list2.add(num);
                    }
                }
            }
            int[] resList = new int[2];
    
            int res1 = list1.get(0);
            int k1 = 1;
            while(k1<list1.size()){
                res1 = (res1^list1.get(k1++));
            }
            int res2 = list2.get(0);
            int k2 = 1;
            while(k2<list2.size()){
                res2 = (res2^list2.get(k2++));
            }
            resList[0] = res1;
            resList[1] = res2;
            return resList;
        }


    public int[] singleNumbers(int[] nums) {
            int n = nums.length;
            int res = 0;
            for(int num:nums){
                res ^= num;
            }
            //获取res中最低位的1
            int mask = 1;
            while ((res & mask) == 0){
                mask <<= 1;
            }
            int a = 0,b = 0;
            for(int num:nums){
                if((num & mask) == 0){
                    a ^= num;
                }else{
                    b^=num;
                }
            }
            return new int[]{a,b};
        }

    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    erlang开发环境(IDE)搭建
    Mono for android,Xamarin点击事件的多种写法
    .NET C#中处理Url中文编码问题
    第一天正式学习,定一个学习目标吧。
    想转行做开发了!
    Java JMS 程序基础 与 ActiveMQ 安装(一)
    JDBC 基础
    Linux 6.4 设置yum 为centOS源
    C++ 简单实现 依赖注入(IOC)
    安卓项目
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/13554957.html
Copyright © 2020-2023  润新知