您的位置:首页 > 其它

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

2019-04-15 17:26 471 查看
版权声明:本文为博主原创文章,欢迎转载,但是请注明出处! https://blog.csdn.net/hubin1995/article/details/89315654

题目描述:

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

求最小正整数M

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

示例-example:

Example 1:

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

Example 2:

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

Example 3:

[code]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代码:

[code]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开始查找就行了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: