443.最大关键数查找 题解及思路
443.最大关键数查找
问题描述
题目描述如下:
小M拿到了一些整数,他定义“关键数”为至少能被其一位数字整除的数。换句话说,如果一个数的某一位数字可以整除该数本身,则称该数为关键数。
现在,给定一个整数
N
,小M想从1
到N
的所有整数中找到一个最大的关键数,并返回它。
示例1:
输入:N = 499
输出:497
解释:
、、
、
故答案为479
示例2:
输入:`N = 1000`
输出:`1000`
解释:
故答案为1000
示例3:
输入:`N = 785`
输出:`785`
解释:
故答案为785
解题思路
思路
总体思路:通过寻找给出的N
的最小余数来找到较近一个关键数,在区间 内寻找最大的关键数
寻找最小余数:
-
通过一个
while
循环while (temp!= 0)
来逐位处理整数N
(借助temp
变量),循环条件表示只要temp
不为0
,就意味着还没处理完所有数位。 -
在循环体中,首先通过
int M = temp % 10;
取出temp
当前的最低位数字,然后通过temp /= 10;
将temp
去掉最低位,继续处理更高位数字。 -
接着通过
if (M == 0)
判断取出的数字是否为0
,如果是0
,则使用continue
语句跳过本次循环剩余部分,直接进入下一次循环,因为0
不能做除数。 -
如果取出的数字不为
0
,则通过if (N % M < minMod)
判断N
除以该数字M
的余数是否小于当前记录的最小余数minMod
,如果小于,就更新minMod
的值为这个新的更小的余数,通过不断循环比较,最终minMod
就会记录下N
除以各位非零数字后的最小余数。
基于最小余数查找关键数:
-
首先通过
if (minMod == 0)
判断最小余数是否为0
,如果是0
,说明N
能被某个数字整除,直接返回N
。 -
如果最小余数不为
0
,则进入后续查找逻辑。先初始化一个变量t
为N - minMod
,表示从比N
稍近的关键数开始查找,同时初始化ans
为Integer.MIN_VALUE
。 -
通过
if (t % M == 0)
判断当前数字t
是否能被取出的各位非零数字M
整除,如果能整除,再通过if (t > ans)
判断该数字是否大于当前记录的最大整数ans
,如果大于,则更新ans
的值为t
,意味着找到了一个更大的满足条件的关键数,继续循环查找,直到外层循环结束,最终ans
就会记录下找到的满足条件的最大整数并返回。
java代码
public static int solution(int N) {
// write code here
int temp = N;
int minMod = Integer.MAX_VALUE;
while (temp != 0) {
int M = temp%10;
temp /=10;
if(M == 0){
continue;
}
if (N % M < minMod) {
minMod = N % M;
}
}
if(minMod == 0){
return N -minMod;
}
int t = N - minMod;
int ans = Integer.MIN_VALUE;
while (t < N){
temp = t;
while (temp != 0){
int M = temp % 10;
temp /=10;
if(M == 0){
continue;
}
if (t % M == 0){
if (t > ans){
ans = t;
}
}
}
t++;
}
return ans;
}