LeetCode题解1015.smallest-integer-divisible-by-k

题目地址

https://leetcode-cn.com/problems/smallest-integer-divisible-by-k/description/

题目描述

给定正整数 K,你需要找出可以被 K 整除的、仅包含数字 1 的最小正整数 N。

返回 N 的长度。如果不存在这样的 N,就返回 -1。

 

示例 1:

输入:1
输出:1
解释:最小的答案是 N = 1,其长度为 1。
示例 2:

输入:2
输出:-1
解释:不存在可被 2 整除的正整数 N 。
示例 3:

输入:3
输出:3
解释:最小的答案是 N = 111,其长度为 3。
 

提示:

1 <= K <= 10^5

思路

这道题是说给定一个 K 值,能否找到一个形如 1,11,111,1111 。。。 这样的数字 n 使得 n % K == 0。

首先容易想到的是如果 K 是 2,4,5, 6,8 结尾的话,一定是不行的。直观的解法是从 1,11,111,1111 。。。 这样一直除下去,直到碰到可以整除的,我们返回即可。 但是如果这个数字根本就无法整除怎么办?没错,我们会无限循环下去。我们应该在什么时刻跳出循环,返回 - 1 (表示不能整除)呢?

我们拿题目给出的不能整除的 2 来说。

  • 1 // 2 等于 1
  • 11 // 2 等于 1
  • 111 // 2 等于 1
  • ...

我们再来一个不能整除的例子 6:

  • 1 // 6 等于 1
  • 11 // 6 等于 5
  • 111 // 6 等于 3
  • 1111 // 6 等于 1
  • 11111 // 6 等于 5
  • ...

通过观察我们发现不断整除的过程,会陷入无限循环,对于 2 来说,其循环节就是 1。对于 6 来说,其循环节来说就是 153。而且由于我们的分母是 6,也就是说余数的可能性一共只有六种情况 0,1,2,3,4,5。

上面是感性的认识, 接下来我们从数学上予以证明。上面的算法用公式来表示就是mod = (10 \* mod + 1) % K。假如出现了相同的数,我们可以肯定之后会无限循环。比如 153 之后出现了 1,我们可以肯定之后一定是 35。。。 因为我们的 mod 只是和前一个 mod 有关,上面的公式是一个纯函数

关键点解析

  • 数学(无限循环与循环节)

代码

#
# @lc app=leetcode.cn id=1015 lang=python3
#
# [1015] 可被 K 整除的最小整数
#

# @lc code=start


class Solution:
    def smallestRepunitDivByK(self, K: int) -> int:
        if K % 10 in [2, 4, 5, 6, 8]:
            return - 1
        seen = set()
        mod = 0
        for i in range(1, K + 1):
            mod = (mod * 10 + 1) % K
            if mod in seen:
                return -1
            if mod == 0:
                return ix
            seen.add(mod)

        # @lc code=end

相关题目

  • 166. 分数到小数
Android App在第54行(Integer.parseInt)崩溃,并且不确定原因 - java

我一直在用手机调试我的应用程序,并且在我将字符串解析为Int的活动中遇到的所有logcat错误均参考第54行。该应用程序的基本思想是一个便士转换器,用户在其中输入他们要转换的便士数量,并从四分之一到其余的便士。在这一点上,我不确定我是否正确地捕获了事件,并且使用匿名内部类来回往返并仅在类中实现。这是Java应用程序的代码:public class Penny…

可以在没有操作系统的情况下运行Java程序吗? - java

我知道所有Java程序都由JVM执行。这使Java与所有操作系统兼容(一次编写,可在任何地方运行)。但是我可以在没有操作系统的情况下运行Java程序吗?也许只运行JVM?并且,如果可能,功能是否会受到任何影响?注意:我的主要问题是,java程序可以直接在硬件上运行(通过JVM)吗?我可以在计算机中“启动”任何低级别的JVM吗? java大神给出的解决方案 实…

查看抽象类的方法是否未被扩展类之一覆盖的方法 - java

我有一个抽象类,比如AbstractClass和扩展该抽象类的多个其他类(700多个)。 AbstractClass有一个方法,比方说baseMethod(),它不是抽象方法。许多类(500+)覆盖该方法并具有自己的实现。现在,通过eclipse,我可以很容易地看到通过Ctrl+Shift+G覆盖该方法的方法,但是除了手动以外,还有其他方法可以看到不覆盖该方…

USB设备发行 - python

我目前正在使用PyUSB。由于我不熟悉USB,所以我不知道如何执行以下操作。我已经从Python PyUSB成功连接到我的USB设备硬件。在代码中,我需要重置USB设备硬件。通过向硬件发送命令来完成。现在,在硬件重置后,我想从Python PyUSB释放当前的USB设备。然后,我想在重置后将其重新连接到USB设备硬件。请让我知道,如何释放USB设备连接和接口…

使用Java检测用户计算机上是否安装了某些软件 - java

我有一个Java应用程序,它需要某些软件(其中一个是Perl)才能运行。我用来检测Perl的方法是:Runtime.getRuntime().exec("perl Test.pl"); 如果存在IOException,则声明不存在Perl。但是,我的一位用户抱怨该应用程序不断失败,因为他没有将Perl放在其路径变量中。所以这就是为什么我要…