[经典面试题][百度]求比指定数大且最小的“不重复数”

【题目】

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

【来源】

2014年百度校招笔试题

【思路一:暴力】

数值加一,判断是否是重复数,如果是,继续加一判断,直到找到一个不是重复数的。

【代码一】

    /*-------------------------------------
    *   日期:2015-02-05
    *   作者:SJF0115
    *   题目: 最小不重复数
    *   来源:百度
    *   博客:
    ------------------------------------*/
    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    using namespace std;
    class Solution{
    public:
        int MinNoRepetition(int n){
            // 加一 判断是否是最小不重复数
            while(isRepetition(n)){
                ++n;
            }//while
            return n;
        }
    private:
        // 判断相邻字符是否重复
        bool isRepetition(int n){
            string str = to_string(n);
            int size = str.size();
            for (int i = 0;i < size;++i) {
                if(i > 0 && str[i] == str[i-1]){
                    return true;
                }//if
            }//for
            return false;
        }//
    };
    int main(){
        Solution s;
        int result = s.MinNoRepetition(19900);
        cout<<result<<endl;
        return 0;
    }

【思路二】

经过分析得到:

只要找到最高重复位即可破题 如1123455 最高重复位为11则改为12其他填充01结果就是1201010 所以从最高位开始截 找到重复的2位,低位+1,然后填充01。

但有一种情况例外 就是99重复 这时候需要进位+1,反向判断 。如2199,则进位+1变为2200,反向判断22重复变为2300,然后填充01变为2301。最惨的就是8989899这种,最后99重复,进位变为8989900,反向判断99重复,进位变为8990000,继续反向判断99重复,进位变为9000000,反向判断通过,填充01变为9010101,结果就是8989899->9010101

【代码二】

    /*-------------------------------------
    *   日期:2015-02-05
    *   作者:SJF0115
    *   题目: 最小不重复数
    *   来源:百度
    *   博客:
    ------------------------------------*/
    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    using namespace std;
    class Solution{
    public:
        int MinNoRepetition(int n){
            string str = to_string(n);
            int size = str.size();
            int result = 0;
            // 开始填充01的位置
            int pos = size;
            for (int i = 0;i < size;) {
                // 情况:99
                if(i > 0 && str[i] == '9' && str[i-1] == '9'){
                    str[i--] = '0';
                    str[i--] = '0';
                    // 99前一位加一
                    if(i >= 0){
                        str[i--] += 1;
                    }//if
                    else{
                        result = 1;
                    }//else
                }//if
                //情况:44
                else if(i > 0 && str[i] == str[i-1]){
                    str[i] += 1;
                    pos = i + 1;
                    break;
                }//else
                else{
                    ++i;
                }
            }//for

            // 前面不重复的
            for(int i = 0;i < pos;++i){
                result = result * 10 + str[i] - '0';
            }//for

            // 添加的01个数
            int count = size - pos;
            for(int i = 1;i <= count;++i){
                // 添加0
                if(i % 2){
                    result = result * 10;
                }//if
                // 添加1
                else{
                    result =result * 10 + 1;
                }//else
            }//for
            return result;
        }
    };
    int main(){
        Solution s;
        int result = s.MinNoRepetition(99);
        cout<<result<<endl;
        return 0;
    }
时间: 2024-10-17 23:35:11

[经典面试题][百度]求比指定数大且最小的“不重复数”的相关文章

2014百度研发真题及其解析-求比指定数大且最小的“不重复数”

题目: 给定一个正整数n,求比n大的第一个"不重复数"."不重复数"的定义:如果一个数,任何相邻两个数位上的数字都不相同,则称为不重复数.例如1234是不重复数,而1101不是. 思路一:暴力 数值加一,判断是否是重复数,如果是,继续加一判断,直到找到一个不是重复数的. #include <iostream> #include <cstring> #include <vector> #include <algorithm&g

怎样在Excel中计算比某个固定数大的最小数字

  ①启动Excel,小编是2007版本,打开先前我准备好了的源数据表格.A.B.C列分别为地区.销售人员.数据,我们要算出数据中大于80的且最小的值. ②在E2输入公式,=large(C2:C13,countif(C2:C13,">80")),记住公式要是在英文半角状态下输入. 计算比某个固定数大的最小数字-行距最小值和固定值"> ③回车,得到结果81,对照源表格,查看到第5行数据是81,是我们想要的结果. 公式说明 首先,Countif函数会统计出大于80的一

[经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。

题目 数轴上从左到右有n各点a[0], a[1], --,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点. 思路一 遍历所有区间跟绳子L比较. i遍历区间起点,j遍历区间终点. 时间复杂度为O(n^2) 代码一 /*------------------------------------- * 日期:2015-02-08 * 作者:SJF0115 * 题目: 绳子覆盖 * 来源:百度2014 * 博客: -----------------------------------

[经典面试题][百度]c++实现STL中的string类

题目 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能. 代码 /*------------------------------------- * 日期:2015-03-31 * 作者:SJF0115 * 题目: 实现string类 * 来源:百度 * 博客: ------------------------------------*/ #include <iostream> #include <cstring> us

[经典面试题][百度]寻找兄弟单词

题目 一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词.提供一个单词,在字典中找到它的兄弟.描述数据结构和查询过程. 思路一 兄弟单词必须满足字符相同,相同字符个数也必须相同.基于这点用Hash实现: (1)申请一个int数组 count[26]用来统计每个字符出现的次数. (2)扫描字典中的单词,只考虑长度和给出单词长度一样大小的单词(长度不同肯定不是兄弟单词),用broCount[26]来统计单词中每个字符出现的次数. (3)如果count和broCount一样,表

[经典面试题][百度]电话号码对应英语单词

题目 现在有一个手机,手机上的键盘上有这样的对应关系,2对应"abc",3对应"def"-..手机里面有一个userlist用户列表,当我们输入942的时候出来拼音的对应可能是"xia","zha","xi","yi"等,当我们输入9264的时候出来是yang,可能是"样","杨","往"等,现在我们输入一个字符串数字,比如92

[经典面试题][百度]在由N个正整数的集合S中,找出最大元素C,满足C=A + B

[题目] 在由N个正整数的集合S中,找出最大元素C,满足C=A + B 其中A,B都是集合S中元素,请给出算法描述,代码与时间复杂度分析. [分析] 1,对集合S进行排序(快排),从小到大排序2,让C指向集合最后一个元素(最大元素)3,让i指向S中第一个元素,让j指向C的前一个元素4,如果,A[i]+A[j]==C则return C;5,如果if(A[i]+A[j]<C)则i++;6,如果if(A[i]+A[j]>C)则j--;7,直道i>=j依然没有找到符合条件的元素,则C在S中向前移

[经典面试题][百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数。

题目 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置. 思路 这道题目最差时间复杂度也是O(N),所以重点在于能不能找到一种尽可能减少比较次数的方法. 如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置.4和1比较,差为3,那么即使最好情况(递增或者递减),4也就是在a[3]的位置,可以跳过a[1]a[2].这样在特定数组(目标值和a[1]相差很大)的情况下或许可以

[历年IT面试题]百度2014研发类校园招聘笔试题解答

一.简答题 动态链接库和静态链接库的优缺点 轮询任务调度和可抢占式调度有什么区别? 列出数据库中常用的锁及其应用场景 二.算法设计题 给定N是一个正整数,求比N大的最小"不重复数",这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位故不是不重复数,而12301是不重复数. 设N是一个大整数,求长度为N的字符串的最长回文子串. 坐标轴上从左到右依次的点为a[0].a[1].a[2]--a[n-1],设一根木棒的长度为L,求L最多能覆盖坐标轴的几个点? 三.系统设计