百度2014校招-深圳-开发测试-求最小“不重复数”

给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如:1101是重复数,1231是不重复数

思路:

1、前把这个正整数加1,保证求得的数比这个数大

2、从左到右开始遍历加1后的正整数,如果前一个数字与后一个数字相同,则后一个数字需要加1 

3、如果后一个数字为9的话,加1会进位,这时可能会引起前面已检测过的值产生重复,此时,需要重新遍历

4、加1后,为保证值最小,则后面数值以10101010...填充

代码:

//方法一,直接+1判断是否符合
//但如11011011011时,效率太低
int GetMin(int a){
    int k,l;
    while(1){
        k=++a;
        l=k%10;
        k/=10;
        while(k){
            if(l==k%10){
                break;
            }else{
                l=k%10;
                k/=10;
            }
        }
        if(k==0)return a;
    }
}

//方法二,也就是本文所写的思路
//直接观察数的各个数字规律求解
int GetMin2(int a){
    int tri=1;
    int front,back;
    for(int i=a;i>10;i/=10)tri*=10;

    while(tri>1){
        front=a/tri%10;
        back=a/(tri/10)%10;
        if(front==back){
                a+=tri/10;//后一个数字加1
                tri/=10;
                a/=tri;//后面的数字先以0填充
                a*=tri;
                if(front!=a/(tri*10)%10)return GetMin2(a);//产生进位,需要重新检验前面的值
        }
        tri/=10;
    }
    return a;      
}

void main(){
    cout<<GetMin2(989899)<<endl;
    cout<<GetMin(989898);
    system("pause");
}
原文地址:https://www.cnblogs.com/yihua/p/3366000.html