力扣找到一个数字的-K-美丽值C
目录
力扣:找到一个数字的 K 美丽值(C++)
一个整数
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){
//读取当前数,如果可以整除+1
int curNum = n % p;
if(curNum != 0 && num % curNum == 0) sum++;
n /= 10;
}
return sum;
}
};
官方给的,喜欢喜欢