我碰到一个常见的面试问题之一,就是找到最接近的回文数。假设输入为127,则输出为131,如果为125,则输出为121。
我可以提出逻辑,但是在某些情况下,例如91、911,我的逻辑将失败。在这些输入中,它的值为99、919,但正确的输出是88和909。
算法步骤为:
最佳答案
这实际上是一个有趣的问题。显然,您要做的不仅仅是暴力破解,还需要使用最高有效的数字并将它们放置在最低有效的数字位置以形成回文。 (我将回文和原始之间的差异称为“距离”)
从这开始,我要说的是,我们可以忽略数字的最低有效部分,因为这实际上并不重要(确定距离时很重要,但仅此而已)。
我将使用一个抽象数字:ABCDEF
。其中A,B,C,D,E,F均为随机数字。再次如我所说,确定回文不需要D,E,F,因为我们想要的是将数字的前半部分镜像到后半部分。显然,我们不想这样做,否则我们将修改更多的有效数字,导致与原始数字的距离更大。
因此,回文应为ABCCBA
,但是正如您已经说过的那样,这并不总是最短的距离。但是,“解决方案”仍然采用XYZZYX
的形式,因此,如果我们考虑最小化我们要修改的数字的“重要性”,那就意味着我们想修改C(或最中间的数字)。
让我们退后一步,看看原因:ABCCBA
A
,因为它位于最不重要的位置:最右边。但是,为了修改最低有效位,我们需要修改最高有效位。所以A
了。 B
也可以这样说,因此C
最终成为我们的选择。 好的,现在我们已经确定要修改
C
以获得可能更接近的数字,我们需要考虑边界。 ABCDEF
是我们的原始号码,如果ABCCBA
不是最接近的回文,那可能是什么?基于上面的小弯路,我们可以通过修改C
来找到它。因此,有两种情况,ABCDEF
大于ABCCBA
或小于ABCCBA
。如果
ABCDEF
大于ABCCBA
,则将1加到C
。我们将说T = C+1
,所以现在我们有了一个数字ABTTBA
。因此,我们将进行测试以确保ABCDEF - ABCCBA > ABCDEF - ABTTBA
如果是这样,我们知道ABTTBA
是最近的回文。随着对C的更多修改,只会使我们越来越遥远。或者,如果
ABCDEF
小于ABCCBA
,则我们将从C
中减去1。假设V = C-1
。因此,我们有了ABVVBA
,就像上面我们将测试的:ABCDEF - ABCCBA > ABCDEF - ABVVBA
,您将拥有相同的解决方案。诀窍是
ABCDEF
总是介于ABTTBA
和ABVVBA
之间,而这些数字之间的唯一其他回文是ABCCBA
。因此,您只有3个解决方案。如果将ABCDEF
与ABCCBA
比较,则只需检查2。我认为您很难适应任何大小的数字。如果是奇数位数,您只需拥有
ABCBA
,ABVBA
和ABTBA
等等。因此,就像您的示例一样:让911。
911 - 919
和911 - 909
因此,这为我们提供了恒定时间算法:)
正如评论中指出的那样,这在最坏的情况下不是固定的时间(哎呀),但肯定比暴力破解更好。
这似乎是您所拥有的,但是我认为我希望能详细阐明该问题,因为这似乎对您而言是一个很小的编程错误。