数组之找出数组中唯一重复的元素

来源:互联网 发布:php 记录日志 编辑:程序博客网 时间:2024/05/01 09:22
//数组之找出数组中唯一重复的元素:将1到N-1这N-1个数放入数组a[N]中,其中某个数重复一次,找出重复的数字;//注意该数组的特性是:数组中的数是连续的;//要求1)每个元素只访问一次,2)不能用辅助空间; //方法一:遍历数组,依次比较,但不符合条件一;//方法二:数组求和法;因为只有一个数字重复一次,而数又是连续的,根据累加和原理,对数组的所有元素求和,//        然后减去1至N-1的和,即为所求的重复数;#include<iostream>using namespace std;int getDuplicates(int *nums,int len){    if(nums==nullptr||len<=0)        return 0 ;    int nSum=len*(len-1)/2;    int sum=0;    for(int i=0;i<len;i++)    {        sum+=nums[i];    }        return (sum-nSum);}int main(){    int nums[]={1,2,2,3,4,5,6,7,8,9,10,11,12};    int len=(sizeof(nums)/sizeof(nums[0]));    int dupNum=getDuplicates(nums,len);       cout<<dupNum<<endl;    system("pause");    return 0;}  //若无上述要求; //方法一:异或法;根据异或运算,每两个相同的异或结果为0;//        所以数组中N个数异或的结果再与(1至N)异或的结果相异或,得到的结果即为所求;int getDuplicates(int *nums,int len){    if(nums==nullptr||len<=0)        return 0 ;    int results=0;    int i;    for(i=0;i<len;i++)    {        results^=nums[i];    }    for(i=1;i<=len-1;i++)    {        results^=i;    }    return results;} //方法二:位图法。原理:先申请一个长度为N-1且均为‘0’组成的数组,然后从头开始遍历数组,//        取每个数组元素的值,将其对应字符串中响应位置置1;若果已经置过1,则该数就是重复的数;//        时间复杂度为O(N),空间复杂度为O(N);int getDuplicates(int *nums,int len){    if(nums==nullptr||len<=0)        return 0 ;    int results=0;    int *numsFlag=new int [len-1];    int i=1;    while(i<len)    {        numsFlag[i]=0;        i++;    }    for(i=0;i<len;i++)    {        if(numsFlag[nums[i]]==0)            numsFlag[nums[i]]=1;        else            {                results=nums[i];                break;            }       }    return results; }     //方法三:hash表 (数组可无序)时间复杂度为O(N),空间复杂度为O(N);int getDuplicates(int *nums,int len){    if(nums==nullptr||len<=0)        return 0 ;    int results=0;    map<int,int> maping;    for(int i=0;i<len;i++)    {        maping[nums[i]]++;        if(maping[nums[i]]==2)        {            results=nums[i];            break;        }            }    return results; } //变形:将1到N-1这N-1个数放入数组a[N]中,至少存在一个重复数,即可能存在多个重复数,O(N)时间里找出其中任意一个重复数,//注意该数组的特性是:数组中的数是连续的;方法一:位图法,使用大小为N的位图,记录每个元素是否出现过,一旦遇到一个已经出现的元素,直接将                 之输出; 时间复杂度为O(N),空间复杂度为O(N);方法二:hash表; 时间复杂度为O(N),空间复杂度为O(N);方法三: 数组排序法;首先对数组进行计数排序,然后顺序遍历数组,直到遇到一个已经出现的元素,直接将之输出。 时间复杂度为O(N),空间复杂度为O(N);


                                             
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ipad开机托运了怎么办 迎客松出现发黄怎么办 孕妇喉咙卡鱼刺怎么办 吃了鱼刺到胃里怎么办 怀孕鱼刺卡喉咙怎么办 异地离职后社保怎么办 异地离职后手续怎么办 异地离职后医保怎么办 爆菊一直疼怎么办 小浪底地质灾害村庄到底怎么办? 地质灾害土地没法种怎么办 湿气重不出汗怎么办 收银中客人插队怎么办 遇到顾客不讲理怎么办 遇到无赖的顾客怎么办 开饭店遇到无赖怎么办 超市收银少钱怎么办 支付宝少收了钱怎么办 碰到找事的顾客怎么办 计泡器里的水减少怎么办 打篮球脖子闪了怎么办 打篮球扭到脖子怎么办 野生老虎老了怎么办 无能力还信用卡怎么办 人过世了信用卡怎么办 信用卡多还了怎么办 银行贷款卡丢了怎么办 信用卡重复还款了怎么办 工资银行卡掉了怎么办 个人贷款卡挂失怎么办 按揭贷款不下来怎么办 没有结婚怎么办房贷 还贷卡损坏了怎么办 信用贷款还不起怎么办 钱误存入信用卡怎么办 省级官员调动家属怎么办 发现中暑人员该怎么办 中暑了怎么办大班教案 中暑了怎么办安全教案 中暑抽筋怎么办喝什么 怀孕初期中暑了怎么办