LeetCode 远征日记(2)

找到一个数字的 K 美丽值

📖 方法一

思路

首先,将问题进行拆分:

  1. 将 num 由 int 类型转化为 string 类型,方便后续获取子字符串。
  2. 在 numStr 中遍历所有可能的长度为 k 的 subNumStr:
    • 计算迭代变量 i 能达到的最大值为:numStr.length() - k
    • 利用 string 中的方法 substr 获取子字符串 subNumStr
  3. 判断 subNumStr 能否整除 num
    • 利用库函数 atoi 将 string 类型的 subNumStr 转换为 int,该库函数自动考虑了前缀为 0 的情况
    • 如果除数为 0 则 continue,否则如果能整除,则 knum++,否则 continue

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <string.h>

class Solution {
public:
    int divisorSubstrings(int num, int k) {
        int knum = 0;
        string numStr = to_string(num); // convert num to string
        for (int i = 0, len = numStr.length(); i <= len - k; i++)
        {
            string subNumStr = numStr.substr(i, k); // get the substring
            if (stoi(subNumStr, 0, 10) == 0)
            {
                continue;
            }
            else if (num % stoi(subNumStr, 0, 10) == 0)
            {
                knum ++;
            }
            else
            {
                continue;
            }
        }
        return knum;
    }
};

收获

  1. 将 int 类型转换为 string 类型:利用全局函数 std::to_string()
  2. 获取字符串 string 的子字符串:string.substr(),例如,str.substr(0, 3),表示从 0 下标开始数 3 个字符构成的字符串。
  3. 从 string 类型转换到数值:
函数 功能
to_string(val) 把 val 转换成 string
stoi(s, p, b) 把字符串 s 从 p 开始转换成 b 进制的 int
stol(s, p, b) long
stoul(s, p, b) unsigned long
stoll(s, p, b) long long
stoull(s, p, b) ugsigned long long
stof(s, p) float
stod(s, p) double
stold(s, p) long double