zoukankan      html  css  js  c++  java
  • 数组中只出现一次的数字

    题目描述

    一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
     
     
    提交链接:点击
     
     
    思路:
       方法一:利用c++ STL的map集合,遍历一遍序列得到元素的次数,再访问取出即可,时间复杂度O(n)。
       方法二:可以用位运算实现,如果将所有所有数字相异或,则最后的结果肯定是那两个只出现一次的数字异或
           的结果,所以根据异或的结果1所在的最低位,把数字分成两半,每一半里都还有只出现一次的数据和成对出现的数据
           这样继续对每一半相异或则可以分别求出两个只出现一次的数字

    代码:
    //方法一
    class Solution {
    public:
        void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
            map<int,int> result;
            for(int i=0;i<data.size();i++){
                result[data[i]]+=1;
            }
            int count=1;
            for(int i=0;i<data.size();i++){
                if(result[data[i]]==1 && count==1){
                    count++;
                    num1[0]=data[i];
                    continue;
                }
                else if(result[data[i]]==1 && count==2){
                    num2[0]=data[i];
                    break;
                }
            }
        }
    };
    //方法二
    class Solution {
    public:
        void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
            if(data.size()<2)  return ;
            int result=0;
            for(int i=0;i<data.size();i++){
                result^=data[i];   //得到两个不同数字的异或结果
            }
            if(result==0) return ;
            int indexOf1=0;
            while((result&1)==0 && indexOf1<8*sizeof(int)){
                result>>=1;  //找到最开始的1,用来区分为两个不同的集合
                indexOf1++;
            }
            *num1=*num2=0;
            for(int i=0;i<data.size();i++){
                if(isBit1(data[i],indexOf1)){
                    *num1^=data[i];
                }else{
                    *num2^=data[i];
                }
            }
        }
       //判断该位是否为1 
        int isBit1(int number,int index){
            number>>=index;  
            return number&1;
        }
    };
  • 相关阅读:
    2018年12月9日 带小苗苗打针 函数2 前向引用 函数即变量
    2018年12月8日 函数变量与递归
    2018年12月7日 字符串格式化2 format与函数1
    2018年12月6日 字符串拼接 %的用法
    2018年11月29日 16点50分 小苗苗出生了
    2018年11月27日 分类与集合
    2018年11月26日 练习3
    2018年11月25日 练习2
    2018年11月24日 周末学习1 字典2
    2018年11月22日 字典 E18灯翼平整度 D&G is SB
  • 原文地址:https://www.cnblogs.com/logo-88/p/9873807.html
Copyright © 2011-2022 走看看