📌  相关文章
📜  可以被K整除并由仅用1组成的最小数字的长度(1)

📅  最后修改于: 2023-12-03 14:50:38.250000             🧑  作者: Mango

判断可被K整除的由1组成的最小数字的长度

本题的主要目标是给定一个整数K,找到一个最小的正整数N,使得N只有由1组成的数字,并且N可以被K整除。

解法
思路

我们可以使用广度优先搜索来解决这个问题,即从小到大枚举由1组成的不同长度的数字,检查它们是否可以被K整除,直到找到一个最小的可行解。

我们需要维护两个队列:一个是存储由1组成的数字的长度的队列,另一个是存储尝试被K整除的数字的队列。

代码
def smallestRepunitDivByK(K: int) -> int:
    if K % 2 == 0 or K % 5 == 0:
        return -1
    queue = deque([1])
    visited = set([1])
    length = 1
    while queue:
        for _ in range(len(queue)):
            num = queue.popleft()
            if num % K == 0:
                return length
            for digit in (0, 1):
                next_num = (num * 10 + digit) % K
                if next_num not in visited:
                    visited.add(next_num)
                    queue.append(next_num)
        length += 1
    return -1
复杂度
  • 时间复杂度:$O(K)$。
  • 空间复杂度:$O(K)$。
总结

本题是一道简单但不容易被一开始理解,需要通过广度优先搜索来构造解,找到最小的正整数N。但在判断可行解时,需要特别注意K能否被2或者5整除的情况。