zoukankan      html  css  js  c++  java
  • 牛客网题目-数组中只出现1次的数字

    题目描述如下:

    一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    题解的主要思想

    1. 异或运算,两个数字相同,异或运算所得结果为0,如果数组中只有一个数出现一次,其他数字都是出现两次,
      根据异或运算原理,就可以将数组所有数字异或,就可以找出,这个只出现一次的数字

    2. 如果数组只有两个数字出现一次,可以将数组分成两组,每组只含有一个只出现一次的数字。如何将数组分成这样的子数组?
      数组中所有数字异或所得结果必定不会0,可以从这个数字提取某一位等于1,将数组所有数组就可以分成,与改位为1的,和不为
      1,的两组,这样每组异或,就可以获得相应的数字。

    代码如下:

    class Solution {
    public:
        void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
             int len = data.size(); 
            if( len < 2 ){
                return ;
            }
            
            int k = 0;
            for(int i=0;i<len; i++){
                k ^= data[i];
            }
            
            int index = fisrtIndexOf1(k);
            *num1 = *num2 = 0;
             for(int i=0; i<len ; i++){
                 if((data[i] >> index)&0x1){
                     *num1 ^= data[i]; 
                 }else {
                     *num2 ^= data[i];
                 }
                 
             }
            
        }
        
        
        int fisrtIndexOf1(int num){
           
            int index = 0;
            while( num  ){
                if(num &(0x1))
                    return index;
                
                 num = num>>1;
                 ++index;
            }
            return -1;
        }
        
        
    };
    
    
    
    
    
    
    
    
  • 相关阅读:
    SQL数据类型详解
    将Excel表格导入DataTable的方法
    .net的反射机制
    经典SQL语句大全(一)
    c# Invoke和BeginInvoke 区别
    c#中两种常用的异步调用方法
    SQL存储过程参数问题
    API 函数大全(下)
    API函数大全 (上)
    javascript 常用function
  • 原文地址:https://www.cnblogs.com/wanshuafe/p/11768985.html
Copyright © 2011-2022 走看看