zoukankan      html  css  js  c++  java
  • 微软面试题 寻找数组中出现的唯一重复的一个数

    1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

    (1)   方法一:(当N为比较大时警惕溢出)

    将1001个元素相加减去1,2,3,……1000数列的和,得到的差即为重复的元素。

     1  int   Find(int*   a)  
     2 
     3   {  
     4 
     5   int   i;
     6 
     7   for  (i = 0;i<=1000;i++)    
     8 
     9                 a[1000]   +=   a[i];    
    10 
    11   a[1000]   -=   (i*(i-1))/2       //i的值为1001  
    12 
    13   return   a[1000];  
    14 
    15   }

    方法二:

    // 找数组中唯一出现2次的数.cpp : Defines the entry point for the console application.   

    假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。 

    此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。 

    如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗? 

     

    1001个数异或结果与1-1000异或的结果再做异或,得出的值即位所求。 

    原理: 

    设重复数为A,其余999个数异或结果为B。 

    1001个数异或结果为A^A^B 

    1-1000异或结果为A^B 

    由于异或满足交换律和结合律,且X^X = 0  0^X = X; 

    则有 

    (A^B)^(A^A^B)=A^B^B=A  

    #include "stdafx.h"   
      
    /* 
      N为数组元素个数减一,即为数组中最大的数,即数的范围为1-N 
      数组长度为N+1 
     */  
      
    void xor_findDup(int * a,int N)  
    {  
        int i;  
        int result=0;  
        for(i=0;i<N+1;i++)  
        {  
            result ^= a[i];  
        }  
      
        for (i=1;i<=N;i++)   
        {  
            result ^= i;  
        }  
      
        printf("%d\n",result);  
      
    }  
      
      
      
    int main(int argc, char* argv[])  
    {  
        int a[] = {1,2,3,4,4};  
        xor_findDup(a,4);  
        return 0;  
    }  
    
    // 找数组中唯一出现2次的数.cpp : Defines the entry point for the console application.
    //
    /*
    假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。
    此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。
    如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?
    
    1001个数异或结果与1-1000异或的结果再做异或,得出的值即位所求。
    原理:
    设重复数为A,其余999个数异或结果为B。
    1001个数异或结果为A^A^B
    1-1000异或结果为A^B
    由于异或满足交换律和结合律,且X^X = 0  0^X = X;
    则有
    (A^B)^(A^A^B)=A^B^B=A
    */
    
    #include "stdafx.h"
    
    /*
      N为数组元素个数减一,即为数组中最大的数,即数的范围为1-N
      数组长度为N+1
     */
    
    void xor_findDup(int * a,int N)
    {
        int i;
        int result=0;
        for(i=0;i<N+1;i++)
        {
            result ^= a[i];
        }
    
        for (i=1;i<=N;i++) 
        {
            result ^= i;
        }
    
        printf("%d\n",result);
    
    }
    
    
    
    int main(int argc, char* argv[])
    {
        int a[] = {1,2,3,4,4};
        xor_findDup(a,4);
        return 0;
    }
  • 相关阅读:
    June 26th 2017 Week 26th Monday
    June 25th 2017 Week 26th Sunday
    June 24th 2017 Week 25th Saturday
    June 23rd 2017 Week 25th Friday
    June 22nd 2017 Week 25th Thursday
    2018最佳网页设计:就是要你灵感爆棚!!!
    图片素材类Web原型制作分享-Pexels
    想要打动HR的心,UX设计师求职信究竟应该怎么写?
    【UXPA大赛企业专访】Mockplus:“设计替代开发”将成为现实
    2018年最好的医疗网站设计及配色赏析
  • 原文地址:https://www.cnblogs.com/WayneZeng/p/3040849.html
Copyright © 2011-2022 走看看