zoukankan      html  css  js  c++  java
  • 百度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");
    }
  • 相关阅读:
    workflow里xaml格式(备忘)
    Excel 读取
    自定义工作流活动的外观的两种方式(补充)
    用SQLite,Enterprise的报错
    WF 4.0
    升级 90天 vs2008 在win2008下。
    NUnitLite web下的用法
    screen常用方法 Lei
    中文摘要的写法 Lei
    bootstrap, boosting, bagging 几种方法的联系 Lei
  • 原文地址:https://www.cnblogs.com/yihua/p/3366000.html
Copyright © 2011-2022 走看看