题目描述:
给定正整数 k ,你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。返回 n 的长度。如果不存在这样的 n ,就返回-1。
注意: n 不符合 64 位带符号整数。
示例 1:
输入:k = 1 输出:1 解释:最小的答案是 n = 1,其长度为 1。
示例 2:
输入:k = 2 输出:-1 解释:不存在可被 2 整除的正整数 n 。
示例 3:
输入:k = 3 输出:3 解释:最小的答案是 n = 111,其长度为 3。
提示:
1 <= k <= 105
分析:
最小正整数n只包含1,所以n只能为1,11,111,……又因为n%k==0,很明显,直接排除k是2或5的倍数的值。
而且n的长度不会超过k。
为什么呢?
咱们先看一个实例——如果有10只鸟,9个笼子,那么就一定至少有两只鸟在一个笼子里。这就是“鸽笼原理”。
10%9==1,1%9==1。我们就可以发现,当我们考虑n+1个数的时候,必然会存在两个数mod n相等。
对这道题而言,若存在n%k==0,n的长度l一定是小于等于k的。
下面是这道题的解答:
代码:
class Solution {
public:
int smallestRepunitDivByK(int k) {
if (k%2==0||k%5==0)return -1;//k为偶数或者5的倍数时,肯定不存在n
int len=1;//最小正整数n的长度
int remain=0;//余数
while (l<=k){
remain = (remain*10+1)%k;
if(remain==0)return l;
l++;
}
return -1;
}
};
运行截图:
复杂度:
时间复杂度:O(n)
空间复杂度:O(1)
注:题目描述和实例来自Leetcode官网,链接:1015. 可被 K 整除的最小整数 - 力扣(LeetCode)