[Leetcode学习-java]Smallest Integer Divisible by K

问题:

难度:medium

说明:

求一个数字 N,N 是由十进制的 1 组成(意思是 1, 11, 111, 1111 都是十进制的数字,不是二进制),然后 N 能够被 K 整除(被整除,就是 N % K  余数为 0),返回一个值最小的 N。

题目连接:https://leetcode.com/problems/smallest-integer-divisible-by-k/submissions/

输入案例:

Example 1:
Input: K = 1
Output: 1
Explanation: The smallest answer is N = 1, which has length 1.

Example 2:
Input: K = 2
Output: -1
Explanation: There is no such positive integer N divisible by 2.

Example 3:
Input: K = 3
Output: 3
Explanation: The smallest answer is N = 111, which has length 3.

我的代码:

其实题目很让人迷惑,说 N 由 1 组成,可能想不通究竟是什么 1,然后 N 被 K整除,意思是 N 除以 K 没有余数,而且 N 是 1, 11 ,111 这样的 十进制数字。

比较数学的题目,看了好久才明白过来,根据公式

mod( i ) = N ( i ) % K

mod( i + 1) = N( i + 1) % K

N( i + 1 ) = N( i ) * 10 + 1

因此得出:mod( i + 1 ) = ( mod( i ) * 10 + 1 ) % K,是分治法。

然后因为,如果是没有能被 K 整除的 N 的数字时候,mod( i ) 会出现一个循环的规则,是需要判断余数是否出现循环就行了,做个 map 缓存。

(不要往 for 循环乱丢东西啊!)

用 map 缓存

class Solution {
    private static boolean[] map = new boolean[50000];
    public int smallestRepunitDivByK(int K) {
        if((K & 1) != 0) {
            Arrays.fill(map, false);
            for(int mod = 1 % K, times = 1;!map[mod];map[mod] = true, mod = (mod * 10 + 1) % K, ++ times) 
                if(mod == 0) return times;
        }
        return -1;
    }
}

如果优化一下,就是当 times <= K 的时候都没办法得出 0 余数,那肯定也没救,因为 map[].length == K,如果已经是 K + 1 肯定是出现重复了。

class Solution {
    public int smallestRepunitDivByK(int K) {
        if((K & 1) != 0) 
            for(int mod = 1 % K, times = 1;times <= K;mod = (mod * 10 + 1) % K, ++ times) 
                if(mod == 0) return times;
        return -1;
    }
}

 

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值