百度2014校招-深圳-開發測試-求最小「不重複數」

給定任意一個正整數,求比這個數大且最小的「不重複數」,「不重複數」的含義是相鄰兩位不相同,例如:1101是重複數,1231是不重複數spa

思路:code

一、前把這個正整數加1,保證求得的數比這個數大blog

二、從左到右開始遍歷加1後的正整數,若是前一個數字與後一個數字相同,則後一個數字須要加1 class

三、若是後一個數字爲9的話,加1會進位,這時可能會引發前面已檢測過的值產生重複,此時,須要從新遍歷效率

四、加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");
}
相關文章
相關標籤/搜索