在整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]
有朋友提到如果输入1111111,效率非常低,确实是这样,诸如这样的还有10998765,,99876543,
这个建议提的非常好,现在把算法做了优化,欢迎好心朋友不吝赐教,一起探讨。
转自http://blog.csdn.net/wujunokay/article/details/12191043
分析:
对于111111,这样的,输出结果要求是不重复数,那自然前2为应该是12,而后面的就应该是0和1来填充,就不用循环取数来判断是不是不重复数了。基于这个思路实现如下:
实现代码如下(这里,我在原作者的代码里加了些注释,又因为gcc编译器不支持itoa()函数,所以改用sprintf()):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int GetMinAbove(int nNum)
{
char Temp[20],OutTemp[20];
int nLen = 0;
int i = 0,j = 0,k = 0;
int nTemp = 0,nCount = 0;
//itoa(nNum,Temp,10);
sprintf(Temp,"%d",nNum);
nLen = strlen(Temp);
//先看输入数字是不是循环数
for(i = nNum;i < nLen -1;i++){//输入数字是循环数时
//处理输入串里是重复数的情况
if(Temp[i] == Temp[i+1]){
if(0 == i){
//998765类的数字时
if(Temp[i] == '9'){
strcpy(OutTemp,"10");
for(j = 1;j < nLen;j++){
OutTemp[j+1] = (j % 2) + '0';
}
}else{
OutTemp[0] = Temp[i];
OutTemp[1] = Temp[i] + 1;
for(j = 2;j < nLen;j++){
OutTemp[j] = (j%2) + '0';
}
}
}else{//'9'不是在输入数字最高位
for(k = 0;k < i;k++){
OutTemp[k] = Temp[k];
}
//1099348
if(Temp[i] == '9'){
OutTemp[i-1] = Temp[i-1] + 1;
if(i > 2){
if(Temp[i-1] == Temp[i-2]){
OutTemp[i-1] = Temp[i-1]+1;
}
}
for(j=i;j<nLen;j++){
OutTemp[j] = (nCount % 2)+'0';
nCount ++;
}
}else{
OutTemp[i] = Temp[i];
OutTemp[i+1] = Temp[i+1] + 1;
for(j = i+2;j < nLen;j++){
OutTemp[j] = (nCount % 2) + '0';
nCount ++;
}
}
}
return atoi(OutTemp);
}
}
for( i = nNum +1;;i++){
//itoa(nNum,Temp,10);
//itoa(i,Temp,10); //注意,这里是i了
sprintf(Temp,"%d",i);
nLen = strlen(Temp);
for(j = 0;j<nLen - 1;j++){
if(Temp[j] == Temp[j+1]){//有重复
break;
}
}
if(j == nLen -1){//没有重复
return i;
}
}
return 0;
}
int main(int argc,char *argv[])
{
int nTemp = 0;
int nRet = 0;
while(1){
scanf("%d",&nTemp);
if(9999 == nTemp){
break;
}else{
nRet = GetMinAbove(nTemp);
printf("%d\n",nRet);
}
}
return 0;
}