LeetCode 1456. 定长子串中元音的最大数目
本文最后更新于 2025年4月21日 凌晨
LeetCode 2269. 找到一个数字的 K 美丽值
一个整数 num
的 k 美丽值定义为 num
中符合以下条件的 子字符串 数目:
- 子字符串长度为
k
。 - 子字符串能整除
num
。
给你整数 num
和 k
,请你返回 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/