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

题目:

给定一个正整数n,求比n大的第一个“不重复数”。”不重复数“的定义:如果一个数,任何相邻两个数位上的数字都不相同,则称为不重复数。例如1234是不重复数,而1101不是。



思路一:暴力

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

#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。

 #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-31 14:23:45

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

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

[题目] 给定任意一个正整数,求比这个数大且最小的"不重复数","不重复数"的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数. [来源] 2014年百度校招笔试题 [思路一:暴力] 数值加一,判断是否是重复数,如果是,继续加一判断,直到找到一个不是重复数的. [代码一] /*------------------------------------- * 日期:2015-02-05 * 作者:SJF0115 * 题目: 最小不重复数 * 来源:百度

2015百度校招笔试真题以及解析(一)

1.为分析用户行为,系统常需存储用户的一些 query ,但因 query 非常多,故系统不能全存,设系统每天只存 m 个 query ,现设计一个算法,对用户请求的 query 进行随机选择 m 个,请给一个方案,使得每个 query 被抽中的概率相等,并分析之,注意:不到最后一刻,并不知用户的总请求量. 解析1:思路:如果用户查询的数量小于 m ,那么直接就存起来.如果用户查询的数量大于 m ,假设为 m+i ,那么在 1-–m+i 之间随机产生一个数,如果选择的是前面 m 条查询进行存取,

2015百度校招笔试真题以及解析(二)

1.static关键字,static全局变量与普通全局变量的区别,static局部变量与普通变量的区别,static函数与普通函数的区别. 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. 这两者在存储方式上并无不同.这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的. 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有

2013百度校招笔试真题以及解析(内存管理及其优缺点总结)

简述Windows内存管理的几种方式以及优缺点. Windows内存管理方式如下图所示: 1.单一连续分配 所谓单一,是指内存中只驻留一道作业.为便于地址转换,把作业连续的存放在内存中,而不是离散的存放.单一连续区的管理思想主要用在早期的单道批处理系统中,采用静态分配的方式,即作业或进程一进入内存,就要等到它结束后才释放内存. 优点: 方法简单,易于实现 缺点: 仅适合于单道程序 2.分区管理 分区管理是把内存划分成若干个大小不等的区域,除操作系统占用一个区域之外,其余由多道环境下的各并发进程共

2013百度校招笔试真题以及解析(二)

1.一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词.提供一个单词,在字典中找到它的兄弟.描述数据结构和查询过程. 思路1:使用hash_map和链表 (1)首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key.例如,将单词按字母从小到大重新排序后作为其key,比如bad的key为abd,good的key为dgoo. (2)使用链表将所有兄弟单词串在一起,hash_map的key为单词的key,value为链表的起始地址. (3)开始时,先遍历字

2013第四届蓝桥杯 C/C++本科A组 真题答案解析【交流帖】

今年的蓝桥杯又已经结束了,做的还是不怎么样,很多题目不难但就是算不出最终的结果,很是纠结,看来路还很长,另外昨天(2013-5-7)也受到了也受到了微软的thank you letter了,哎,都是苦逼的一天.不说了,直接看题吧,如果你对我的做法有异议或者有更好的解法,请给我留言,我会及时更新~~~~~ 1.高斯日记  大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯

备战2016年软考必做真题!

网络规划设计师 2012年下半年网络规划设计师下午案例分析真题+答案解析:http://down.51cto.com/data/1405756 2013年网络规划设计师上午真题及答案解析:http://down.51cto.com/data/1861654 2014年下半年网络规划师下午1案例分析真题及答案:http://down.51cto.com/data/1906669 2015 年下半年网络规划师下午案例分析真题及答案:http://down.51cto.com/data/2117462

百度统计中索引量与site命令查询数差异较大的原因

自百度统计3.0推出之后,百度统计里面的功能百度索引量查询的功能成为了seo人 员的焦点,一是因为此项功能的数据更新时间做了调整,从原来的每周一次改为现在的每天一次;二是因为,好多站长反映百度索引量与site命令查询到的结果 有很大的差异.针对数据差异较大的问题,目前百度官方也没有给出确切解释,seo的知名人士也没有做相应解释.今天,孟则宇就来研究一下这个问题吧! 1.多数网站出现索引量数据与site查询结果数差异较大的情况 我在百度统计的官方贴吧,发现后很多人在反应这个问题,在贴吧首页里最少有

动态规划法求文本串的最优分行问题河海大学考博计算机算法设计与分析真题着急求解中

问题描述 动态规划法求文本串的最优分行问题河海大学考博计算机算法设计与分析真题着急求解中 列表并至少给出4步典型过程,求文本串"Do you like those people who always think of money and cannot remember the past."在列宽为15,惩罚函数为行空余空间的平方(最后一行不计惩罚)时的最优分行方案.不需要给出具体的实现代码.用动态规划算法给出列表