繁体   English   中英

我将如何尝试并期望块 python 在 for 循环中捕获无限循环

[英]How would I make a try and expect block python to catch an infinite loop in a for loop

我正在解决一个问题,我必须将 output 大于 N 的最小数字包含与 N 相同的数字。如果没有这样的数字,我必须打印“0”作为 output。 这是我现在的代码......

n = int(input())
copy = n+1
while True:
    if sorted(str(n)) == sorted(str(copy)):
        print(copy)
        break
    else:
        copy+=1

如果一个数字没有这样的数字,我无法找到一种方法来捕捉,因此,“0”。 我在想一个 try expect 块,但它以某种方式捕获了无限循环。 关于如何实现这一点或任何其他建议的任何想法? 谢谢!

样本输入/输出

输入1: 156

output 1: 165

输入 2: 330

output 2: 0 (没有这个数满足条件)

输入 3: 27711

output 3: 71127

我对这个问题有不同的方法:

  1. 如果所有数字按降序排序,则 output 始终为 -1。 例如,321。
  2. 对于其他情况,我们需要从最右边处理数字(为什么?因为我们需要找到所有较大数字中的最小值)

算法

  1. 从最右边的数字开始遍历给定的数字,继续遍历直到找到一个小于之前遍历的数字的数字。 例如,如果输入数字是“534976”,我们停在 4,因为 4 小于下一个数字 9。如果我们没有找到这样的数字,那么 output 是“不可能”。

  2. 现在在上面找到的数字“d”的右侧搜索大于“d”的最小数字。 对于“534976”,4 的右侧包含“976”。 大于 4 的最小数字是 6。

  3. 交换上面找到的两个数字,我们在上面的例子中得到 536974。

  4. 现在将所有数字从“d”旁边的 position 到数字末尾进行排序。 我们排序后得到的数字是output。 最后,对于上面的例子,我们得到“536479”,这是输入 534976 的下一个更大的数字。

  5. 在最后一步中,我们应该检查天气结果是否为 32 位数字。


代码

def nextGreaterElement(n):
    n = list(str(n))
    N = len(n)

    for x in range(N - 1, 0, -1):
        if n[x] > n[x - 1]:
            i = x - 1
            break
    else:
        return -1

    swap = i + 1
    pos = i

    for x in range(swap, N):
        if n[pos] < n[x] < n[swap]:
            swap = x

    n[pos], n[swap] = n[swap], n[pos]

    ans = int(''.join(n[:pos + 1]) + ''.join(sorted(n[pos + 1:])))

    return ans if len(bin(ans)[2:]) < 32 else -1    


print(nextGreaterElement(123))
# 132

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM