443.最大关键数查找 题解及思路 | 豆包MarsCode AI刷题

10 阅读3分钟

443.最大关键数查找 题解及思路

443.最大关键数查找

问题描述

题目描述如下:

小M拿到了一些整数,他定义“关键数”为至少能被其一位数字整除的数。换句话说,如果一个数的某一位数字可以整除该数本身,则称该数为关键数。

现在,给定一个整数 N,小M想从 1 到 N 的所有整数中找到一个最大的关键数,并返回它。

示例1:

输入:N = 499
输出:497

解释: 497÷7=71497 \div 7 = 71

498÷8=62.25498 \div 8 = 62.25498÷9=53.33498 \div 9 = 53.33498÷4=124.5498 \div 4 = 124.5

499÷9=55.44499 \div 9 = 55.44499÷4=124.75499 \div 4 = 124.75

故答案为479

示例2:

输入:`N = 1000`  
输出:`1000`

解释: 1000÷1=10001000 \div 1 = 1000

故答案为1000

示例3:

输入:`N = 785`  
输出:`785`

解释: 785÷5=157785 \div 5 = 157

故答案为785

解题思路

思路

总体思路:通过寻找给出的N最小余数来找到较近一个关键数,在区间NminModiNN-minMod \leq i\leq 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;
}