波波老师,请教下求一个比n大的不重复数

来源:11-1 结语

芒果和芒果柠檬

2018-07-30

我在这门课中认真听完了所有课程。课后的练习也都适当地做了些,但是上周的两次面试遇到的算法面试还是没能顺利答出来。其中有一道题是求比N大的最小“不重复数”。不重复数的定义是一个正整数任意相邻位置 不能有相同的数值。举个例子 121  -->  123,  100 --> 101。 后来看了下这个题目,自己也无法把这类题目归纳到课程中的任何一种分类。请问下思维还有提升的方法么 请教下波波老师

写回答

1回答

liuyubobobo

2018-07-30

算法问题包含的太广阔了,这个课程中的问题只是经典的“套路”(其实套路也不完全:()。


对于更灵活的问题训练,有以下一些建议:

1)适当做算法竞赛。但不要啃难题,就看简单组(在一般算法比赛中称为div2)的问题即可。大部分简单组的问题,如果觉得没思路的话,其实基本都不是因为数据结构和算法,而是一些非常tricky的想法。其实,这个问题在我看来就是一个典型的div2级别的算法竞赛问题。。。

2)适当看离散数学。其实如果稍微做一些算法比赛,经典的算法与数据结构的已经过关了的话,如果一定找学习材料,基本就是离散数学了了。算法竞赛中离散数学相关的问题是很多的。

3)另外,对于这个课程,还有一些比较重要的算法部分不涉及。一部分是相对较大规模的数据算法相关。比如内存已经无法完全承载数据的情况。另一部分则是系统设计相关。有时间可以在网上搜索一下相关问题:)


------


回到你的问题。


首先,如果是面试(或者笔试),一定要答暴力解法!从n开始,每次+1,然后验证,直到找到一个没有相邻重复数字的数!不吃亏!有的时候,更好的想法就是基于暴力解法想出来的!可能在答暴力解法的过程中,就有了好的想法:)


当然这个方案肯定不够优。更优的方法是直接构造。


首先,n + 1。

然后,扫描这个数,找到第一对相邻的重复的数字。这两个数字的后者 + 1(因为要大于n),然后,这个数字后面的所有位,用最小的不相邻数字填充,即01010101....

如1233333333899908(随便写的),找到第一对相邻的重复数字,即12后面的33,将第二个3加1变成4,后面用01填充,就是1234010101010101


但是,有一种特殊情况要注意,如果第一对相邻的重复数字是99,后一个数字+1后就会产生进位(跳到99前面的数字+1,然后99变成00),之后,重新扫描这个数字即可。(此时第一对相邻的重复数字肯定不是99)

如21997866666,找到第一对相邻的数字是99,则作为进位处理,变成22007866666,然后,按照上面的算法处理,最后结果是23010101010


加油!:)


2
3
liuyubobobo
回复
芒果和芒果柠檬
谢谢你的支持:)对你有帮助最重要。加油!:)
2018-07-31
共3条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程