百度笔试题----最小不重复数

 

百度笔试题----最小不重复数

分类: 算法   251人阅读  评论(0)  收藏  举报

给定一个任意数,找出比这个数大的最小不重复数(不重复数是指:这个数的相邻两位不同如:1231为不重复数,而1233为重复数)。

其实这个题目,看起来挺简单的,我只要从这个数开始一直向上找,总会找到吧。。确实,但是如果我给你一个特别大的数呢,比如:111111111,这就傻了,那要遍历多少个数啊!所以这样做很不现实。那我们就来分析下吧。先找几个用例看看:

123------------>124

111------------>120

999------------>1010

8989------------>9010


通过分析,我们很容易想到,从前往后遍历 ,看是否有相邻的元素相同,如果有,那么要分成两种情况:相同的数为9和不为9。如果不为9,那么直接将第二位+1,后面的就变成010101....。;如果为9,那么从第一个9开始就要变成010101,而且还存在进位,相当于加上100000(此时的情况为:*99_ _ _)如果没有,那么直接+1就可以了?(8989这种特例)这还不够,还必须对这个新的数进行判断是否是重复数,如果是就执行上述代码,如果不是,就返回这个数。


[cpp]  view plain copy
  1. <span style="font-size:18px">#include<iostream>  
  2. using namespace std;  
  3.   
  4. bool isOK=false;//如果是重复数,通过处理后肯定可以直接输出。否则还必须进行下一轮的处理。  
  5. bool isFirstDeal=true;//是否是第一次处理这个新输入的数  
  6. int deal(int input)  
  7. {  
  8.     bool isChange=false;//判断是否是重复数  
  9.     bool isOverFlow=false;  
  10.     char* temp=new char[12];  
  11.     memset(temp,0,12);  
  12.     itoa(input,temp,10);          
  13.     int length=strlen(temp);  
  14.     int i=1;  
  15.     while(i<length)  
  16.     {  
  17.         if(temp[i]==temp[i-1])  
  18.         {  
  19.             isChange=true;  
  20.             if(temp[i]!='9')  
  21.             {  
  22.                 temp[i]+=1;  
  23.                 break;  
  24.             }  
  25.             else  
  26.             {  
  27.                 isOverFlow=true;  
  28.                 break;  
  29.             }  
  30.         }  
  31.         ++i;  
  32.     }  
  33.     int result;  
  34.     if(isChange)  
  35.     {  
  36.           
  37.         if(!isOverFlow)//重复9溢出  
  38.         {  
  39.             if(i+1<length)  
  40.                 temp[i+1]='0';    
  41.             int j=i+2;  
  42.             for(j;j<length;++j)  
  43.             {  
  44.                 temp[j]=(temp[j-1]-'0'+1)%2+'0';  
  45.             }  
  46.             result=atoi(temp);  
  47.         }  
  48.         else  
  49.         {  
  50.             temp[i-1]='0';  
  51.             int j=i;  
  52.             for(j;j<length;++j)  
  53.             {  
  54.                 temp[j]=(temp[j-1]-'0'+1)%2+'0';  
  55.             }  
  56.             int base=1;  
  57.             for(j=i-1;j<length;++j)  
  58.                 base*=10;  
  59.             result=atoi(temp)+base;  
  60.         }  
  61.         isOK=true;//因为这个是重复数,已经处理过了,可以直接输出  
  62.     }  
  63.     else   
  64.     {  
  65.         if(isFirstDeal)  
  66.             result=input+1;  
  67.         else  
  68.             result=input;  
  69.         isOK=false;//因为不是重复数,虽然已经处理过一遍(加了1),但还是需要处理第二次,防止加1之后的数为重复数。  
  70.     }  
  71.     delete[] temp;  
  72.     return result;  
  73. }  
  74.   
  75. void main()  
  76. {  
  77.     int input;  
  78.     while(cin>>input)  
  79.     {  
  80.         int result=deal(input);  
  81.         if(isOK)  
  82.             cout<<"输出: "<<result<<endl;  
  83.         else  
  84.         {  
  85.             if(isFirstDeal)  
  86.             {  
  87.                 isFirstDeal=false;  
  88.                 result=deal(result);  
  89.             }  
  90.             cout<<"输出: "<<result<<endl;  
  91.         }  
  92.         isOK=false;  
  93.         isFirstDeal=true;//返回初始状态  
  94.     }  
  95. }</span>  
百度笔试题----最小不重复数_第1张图片

你可能感兴趣的:(算法)