leetcode第129周赛-1015. Smallest Integer Divisible by K,被K整除的最小整数


题目描述:

给定一个正整数K(1<=K<=1e5),找一个最小整数M(全由1构成,例如1,11,111,11111),使得该整数能被K整除

求最小正整数M

原题链接:https://leetcode.com/problems/smallest-integer-divisible-by-k/


示例-example:

Example 1:

Input: 1
Output: 1
Explanation: The smallest answer is N = 1, which has length 1.

Example 2:

Input: 2
Output: -1
Explanation: There is no such positive integer N divisible by 2.

Example 3:

Input: 3
Output: 3
Explanation: The smallest answer is N = 111, which has length 3.

解决思路:

1)首先很显然,当K的因数包含2或者5时,不可能找到全为1的正整数M满足题意。

2)假设K=113,显然从M=1111开始尝试,首先余数remainder=M%K=94。又因为M_next = 11111 = 10 * M + 1,所以有M_next % K = (10 * (M % K) + 1) % K。后面所有依此类推,直到余数为0(说明找到解)或者余数出现重复(说明无解)。

3)为了解决余数重复出现的问题,需要一个list或者set来进行判断,诸位可以根据自己所掌握的编程语言,自行设计这一环节。


Python3代码:

class Solution:
    def smallestRepunitDivByK(self, K: int) -> int:
        if K%2 == 0 or K%5 == 0:
            return -1
        minlen = 1
        nowrem = 1 % K
        remainderlist = list([])
        while (nowrem != 0) and (nowrem not in remainderlist):
            nowrem = (10 * nowrem + 1) % K
            minlen += 1
        if nowrem == 0:
            return minlen
        else:
            return -1

一些体会:

       1)上述代码实测发现,即使不使用remainderlist来判断余数是否出现也能Accepted。由此猜测,要么是题目给的测试样例过于友好;要么可以得到一条数学推论:任意一个正整数K,如果它的余数不包含2和5,那么一定可以找到一个全由1组成的数字M,使得M能被K整除。关于这个数学推论,在下感觉挺有意思的,不知道有没有数学系的大神可以证明下?

       2)最开始不需要判断K是几位数,然后找一个恰好不小于K的M。因为M从1开始就一直满足前面解题思路中所说的规律,所以直接让M从1开始查找就行了。

你可能感兴趣的:(leetcode,算法设计)