LeetCode 1456. 定长子串中元音的最大数目

本文最后更新于 2025年4月21日 凌晨

LeetCode 2269. 找到一个数字的 K 美丽值

一个整数 numk 美丽值定义为 num 中符合以下条件的 子字符串 数目:

  • 子字符串长度为 k
  • 子字符串能整除 num

给你整数 numk ,请你返回 num 的 k 美丽值。

注意:

  • 允许有 前缀 0
  • 0 不能整除任何值。

一个 子字符串 是一个字符串里的连续一段字符序列。


滑动窗口题,k 是窗口长度,在给定的整数上移动窗口,将窗口内的数字视为一个数字,如果这个数字可以整出 num,那么 num 的美丽值则加1。

我们可以将窗口视为字符串子串处理,将子字符串转为数字。也可以将窗口视为数字处理,每次直接计算窗口数字值。

字符串

将给定的数字 num 视为一个字符串,然后窗口是子字符串,每次移动都将窗口内的字符串转为数字,计算美丽值。

class Solution {
    public int divisorSubstrings(int num, int k) {
        int kBeauty = 0;

        // 将字符串转为字符数组
        String snum = String.valueOf(num);
        char cnum[] = snum.toCharArray();

        // 移动长度位 k 的窗口
        for (int i = 0; i + k - 1 < cnum.length; i++) {
            int left = i;

            // 将窗口内的字符转为字符串
            String subStr = String.valueOf(cnum, left, k);

            // 字符串转为数值
            int winNum = Integer.valueOf(subStr);

            // 排除 0,并计算美丽值
            if (winNum != 0 && num%winNum == 0) {
                kBeauty++;
            }

        }
        return kBeauty;
    }
}

数值

class Solution {
    public int divisorSubstrings(int num, int k) {

        int result = 0;

        // 计算取模底数,保留窗口k长度的数字
        int preffixFactor = 1;
        for (int i = 0; i < k; i++) {
            preffixFactor = preffixFactor * 10;
        }

        // 窗口从数字的最右侧移动,每次都除以10抛弃一个数字。
        for (int calNum = num; calNum >= preffixFactor/10; calNum = calNum/10) {
            int subNum = calNum%preffixFactor;

            if (subNum != 0 && num%subNum == 0) {
                result++;
            }
        }

        return result;
    }
}

LeetCode 1456. 定长子串中元音的最大数目
https://blog.avezah.com/leetcode/lc2269/
作者
avezah
发布于
2025年3月23日
许可协议