2023-05-10每日一题
一、题目编号
1015. 可被 K 整除的最小整数
二、题目链接
三、题目描述
给定正整数 k ,你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。
返回 n 的长度。如果不存在这样的 n ,就返回-1。
注意: n 不符合 64 位带符号整数。
四、解题代码
class Solution {
unordered_set<int> S;
public:
int smallestRepunitDivByK(int k) {
int res = 1;
int remainder = 1 % k;
while(!S.count(remainder)){
if(remainder == 0){
return res;
}
S.insert(remainder);
remainder = (remainder * 10 + 1) % k;
res++;
}
return -1;
}
};
五、解题思路
(1) 首先思考一个最简单的问题,如何判断出找到的数字是符合要求的,这自然很简单,我们将找到的数字除以k,判断余数为0即可。
(2) 那么我们最朴素的方法就是一直遍历符合要求的数字直到判断出符合要求为止,这个时候,出现一个问题,万一不存在这个数字呢,此时就发现我们暴力的思路是不可取的,这时候我们就需要从数学的角度来解决问题了。
(3) 朴素的思路是依次判断1 、 11 、 111是否符合要求。但是这样没有一个跳出循环的终点,这个时候需要想办法解决。我们知道11 是由1 * 10 + 1得到的,111 是由10 * 10 + 1,实际上我们可以判断的不是数字本身,而是余数,这如何理解呢。
(4) 一开是num = 1,我们判断的是num % k == 0,不是然后判断(num * 10 + 1 )% k == 0,那么我们完全可以先将num % k先预处理一下,这样我们进行判断余数为0的数字是不会越界的。我们每次将得到的余数存储进set中,如果set中存在该余数,则表明进入到死循环中,一定不存在,如果叙述为0,则输出位数了,因为我们是用余数来判断的,所以我们本身不能通过数字本身来判断位数,我们需要用一个标记来记录位数,初始从1开始一直递增帮忙辅助。