最小数量大于给定数量,这是一个回文

时间:2014-02-08 18:47:24

标签: algorithm language-agnostic palindrome

这是在接受采访时被问到的。给定一个数字,比如900,输出最小的回文大于该数字,在这种情况下为909。我给了一个强力解决方案,检查每个数字,但我假设有一个更好的方法来解决这个问题

3 个答案:

答案 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/