一个整数
num
的 k 美丽值定义为num
中符合以下条件的 子字符串 数目:
- 子字符串长度为
k
。- 子字符串能整除
num
。给你整数
num
和k
,请你返回num
的 k 美丽值。注意:
- 允许有 前缀 0 。
0
不能整除任何值。一个 子字符串 是一个字符串里的连续一段字符序列。
示例 1:
输入:num = 240, k = 2 输出:2 解释:以下是 num 里长度为 k 的子字符串: - "240" 中的 "24" :24 能整除 240 。 - "240" 中的 "40" :40 能整除 240 。 所以,k 美丽值为 2 。示例 2:
输入:num = 430043, k = 2 输出:2 解释:以下是 num 里长度为 k 的子字符串: - "430043" 中的 "43" :43 能整除 430043 。 - "430043" 中的 "30" :30 不能整除 430043 。 - "430043" 中的 "00" :0 不能整除 430043 。 - "430043" 中的 "04" :4 不能整除 430043 。 - "430043" 中的 "43" :43 能整除 430043 。 所以,k 美丽值为 2 。提示:
1 <= num <= 109
1 <= k <= num.length
(将num
视为字符串)
题解一
to_string():将int转为string
stoi():将string转为int //在这里用的是strtoll()
strtoll() :用于将字符串转换为长长整型(long long int) //使用字符串到数值的转换函数,并检查是否溢出。
substr() 字符串的切片函数
end
是一个 const char*
类型的指针,通常用于遍历或标记字符串中的某个位置。(可以在循环中通过 end++
逐步移动指针。)
.c_str()
返回一个 const char*
指针,指向 sub
的首字符地址。
#include <string>
#include <cstdlib>
#include <cerrno>using namespace std;class Solution {
public:int divisorSubstrings(int num, int k) {string s = to_string(num);int n = s.size();if (n < k) return 0;int count = 0;for (int i = 0; i <= n - k; ++i) {string sub = s.substr(i, k);char* end;errno = 0; // 重置错误标志long long val = strtoll(sub.c_str(), &end, 10);// 检查转换是否完全成功if (end != sub.c_str() + sub.size()) {continue;}// 处理溢出情况if (errno == ERANGE) {// 只有当子字符串等于原字符串时才计数if (sub.size() == s.size() && sub == s) {++count;}continue;}// 忽略值为0的情况if (val == 0) {continue;}// 检查是否能整除if (num % val == 0) {++count;}}return count;}
};
题解二
class Solution {
public:int divisorSubstrings(int num, int k) {long sum = 0 , p = pow(10, k) , n = num;//从右往左滑,当没有划到最左边while(n / (p / 10) > 0){//读取当前数,如果可以整除+1int curNum = n % p;if(curNum != 0 && num % curNum == 0) sum++;n /= 10;}return sum;}
};
官方给的,喜欢喜欢