这是在接受采访时被问到的。给定一个数字,比如900,输出最小的回文大于该数字,在这种情况下为909。我给了一个强力解决方案,检查每个数字,但我假设有一个更好的方法来解决这个问题
答案 0 :(得分:4)
只是为了好玩,这是Python中的一个简单实现(使用与Guntram Blohm描述的基本相同的算法)。
def next_palindrome(n):
"""
Given a non-negative integer n, return the first integer strictly
greater than n whose decimal representation is palindromic.
"""
s = str(n + 1)
l = len(s)
if s[:l//2][::-1] < s[(l+1)//2:]:
head = str(int(s[:(l+1)//2])+1)
else:
head = s[:(l+1)//2]
return int(head + head[:l//2][::-1])
一些示例输出:
>>> next_palindrome(123)
131
>>> next_palindrome(4321)
4334
>>> next_palindrome(999)
1001
答案 1 :(得分:3)
将第一个数字复制到最后一个数字,将第二个数字复制到倒数第二个数字等,直到达到中心数字(如果有偶数个数字,则将中心2位数字复制)。
如果结果数字小于原始数字,请将中心数字/中心2位数字增加1。如果它们是9,则将它们设置为零,然后用它们旁边的2位数重试,向外移动直到你击中非9。
编辑:
如果向外移动的循环从不击中非9,则在字符串前加1,将除最后一个之外的所有数字设置为0,将最后一个数字设置为1.这与将2加到数字相同
答案 2 :(得分:0)
虽然上面已经回答的是绝对正确的。只是为了增加理解:)
可以有三种不同类型的输入需要单独处理。
1)输入数字是回文并且全部为9。例如“9 9 9“。输出应为“1 0 0 1”
2)输入数字不是回文数据。例如“1 2 3 4”。产量 应该是“1 3 3 1”
3)输入数字是回文并且没有全部9。例如 “1 2 2 1”。输出应为“1 3 3 1”。
输入类型1的解决方案 简单。输出包含n + 1个数字,其中角数为1,角数之间的所有数字均为0。
现在让我们先谈谈输入类型2和3.让我们首先定义以下两个术语:
Left Side:
给定数字的左半部分。 “1 2 3 4 5 6”的左侧是“1 2 3”,“1 2 3 4 5”的左侧是“1 2”
Right Side:
给定数字的右半部分。 “1 2 3 4 5 6”的右侧是“4 5 6”,“1 2 3 4 5”的右侧是“4 5”
要转换为回文,我们可以采取左侧镜子或右侧镜子。但是,如果我们采取右侧的镜子,那么所形成的回文不能保证是下一个更大的回文。
所以,我们必须把左侧的镜子复制到右侧。但有些情况必须以不同的方式处理。请参阅以下步骤。
我们将从两个指数i和j开始。我指向两个中间元素(或指向n为奇数的中间元素周围的两个元素)。我们一个接一个地移动i和j。
Step 1.
最初,忽略左侧与右侧相应部分相同的部分。例如,如果数字是“8 3 4 2 2 4 6 9”,我们忽略中间四个元素。我现在指向元素3,j现在指向元素6.
Step 2.
在第1步之后,出现以下情况:
Case 1:
指数i&amp; j越过边界。
输入数字为回文时会发生这种情况。在这种情况下,我们只需将1添加到中间数字(或者在n为偶数的情况下为数字)将进位传播到左侧的MSB数字并同时将左侧的镜像复制到右侧。
例如,如果给定的数字是“1 2 9 2 1”,我们将9增加到10并传播进位。因此数字变为“1 3 0 3 1”
Case 2:
左侧和右侧之间有数字不相同。所以,我们只是将左侧镜像到右侧&amp;尽量减少形成的数量,以保证下一个最小的回文。
在这种情况下,可能有两个子案例。
2.1)
将左侧复制到右侧就足够了,我们不需要增加任何数字,结果只是左侧的镜像。以下是这个子案例的一些例子。
“7 8 3 3 2 2”的下一个回文是“7 8 3 3 8 7”
“1 2 5 3 2 2”的下一个回文是“1 2 5 5 2 1”
“1 4 5 8 7 6 7 8 3 2 2”的下一个回文是“1 4 5 8 7 6 7 8 5 4 1”
我们如何检查这个子案例?我们需要检查的是在步骤1中忽略的部分之后的数字。该数字在上面的示例中突出显示。如果该数字大于右侧数字中的相应数字,则将左侧复制到右侧就足够了,我们不需要做任何其他操作。
2.2)
将左侧复制到右侧是不够的。当上面定义的左侧数字较小时会发生这种情况。以下是此案例的一些例子。
“7 1 3 3 2 2”的下一个回文是“7 1 4 4 1 7”
“1 2 3 4 6 2 8”的下一个回文是“1 2 3 5 3 2 1”
“9 4 1 8 7 9 7 8 3 2 2”的下一个回文是“9 4 1 8 8 0 8 8 1 4 9”
我们像案例1一样处理这个子例子。我们只是在中间数字上加1(或者ase n中的数字是偶数)将进位传播到左侧的MSB数字,同时将左侧的镜像复制到右侧。
消息来源:http://www.geeksforgeeks.org/given-a-number-find-next-smallest-palindrome-larger-than-this-number/