一、Problem
給定正整數 K,你需要找出可以被 K 整除的、僅包含數字 1 的最小正整數 N。
返回 N 的長度。如果不存在這樣的 N,就返回 -1。
示例 1:
輸入:1
輸出:1
解釋:最小的答案是 N = 1,其長度爲 1。
輸入:2
輸出:-1
解釋:不存在可被 2 整除的正整數 N 。
提示:
1 <= K <= 10^5
二、Solution
方法一:set 判重
思路
只包含 1 的數字的推導方法是:N = N × 10 + 1(N 初值爲 1)
,但爲防止溢出,我們在外面增加了一層取模:N = (N × 10 + 1) % K)
如果求解 N的過程中,遇到了重複數字,那麼證明該數字永遠不能被 K 整除了,返回 -1 即可
特判:當 N 爲 1 且 K 爲 1 時,N 可被 K 整除,應立即返回 1
class Solution {
public int smallestRepunitDivByK(int K) {
int N = 1 % K, len = 1;
Set<Integer> seen = new HashSet<>();
while (N != 0) {
if (seen.contains(N))
return -1;
seen.add(N);
N = (N * 10 + 1) % K;
len++;
}
return len;
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,
方法二:數學推導 = 空間壓縮
別人的給出的證明說 K = 2 或 5 的倍數時,全 1 數字不可能被此時的 K 除盡,其它一樣…
class Solution {
public int smallestRepunitDivByK(int K) {
if (K % 2 == 0 || K % 5 == 0)
return -1;
int N = 1, len = 1;
while (N % K != 0) {
N = (N * 10 + 1) % K;
len++;
}
return len;
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,