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;
}