华为面试题 及其自己的扩展

来源:互联网 发布:01背包问题贪心算法 编辑:程序博客网 时间:2024/06/12 08:31

华为有个题目是:有一组数据,里面只有两个数是单独存在的,其他的数都是两两存在。请你找出这两个数。

网上的解题思路是从一个数上开始的。如果 2 3 3 .如何找到2呢?那么对这些数异或,3^3结果为0,所以结果2^3^3=2就找到了。

所以下面的关键就是如何使这两个数分组。比如2 3 3 4 由于2^4!=0。所以我们想到了从左到右找第一个结果为0的那位。根据

这个位置进行分组。然后利用找一个数的思想解题。

#include <iostream>using namespace std;void findTwoUnique(int a[],int len){int temp=0;int num1=0;int num2=0;int cnt=0;/************************************************************************//*          这个是求得两个不同数的异或值         此事0100^0101得 0001                *//************************************************************************/for (int i=0;i<len;i++){temp=temp^a[i];}/************************************************************************//*                         这是从做到右得到第一个为1的值,以此为突破口分组           *//************************************************************************/while(temp&1==0){temp=temp>>1;cnt++;}/************************************************************************//*                对对应位是否为1或者0分别分组                                           *//************************************************************************/for (int i=0;i<len;i++){int b=a[i] >> cnt;if(b&1==1){num1=num1^a[i]; // 分组后分别求值}else{num2=num2^a[i]; //分组后分别求值}}cout << num1 <<  "  " << num2 << endl;}void main(){int a[]={1,1,2,4,3,3,2,5};findTwoUnique(a,8);}



如果是找所有字符均出现过一次的那该怎么办?又如找到出现三次的。可以利用accII码来帮我们。完全与上面的思想不一样。程序如下:

#include <iostream>#include <string>using namespace std;void findUnique(char* str,int n){string tempstr="";int  flagCh[256]={0};for (int i=0;i<n;i++){if (flagCh[str[i]]==0){flagCh[str[i]]++;}else if(flagCh[str[i]]==1){flagCh[str[i]]++;}}for (int i=0;i<n;i++){if(flagCh[str[i]]%2==1){tempstr=tempstr+str[i];}}cout << tempstr;}void main(){char str[100]="heello22344";int n=strlen(str);findUnique(str,n);}


0 0