2023-05-10 LeetCode每日一题(可被K整除的最小整数)

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开始一直递增帮忙辅助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值