当前位置: 首页 > news >正文

力扣:找到一个数字的 K 美丽值(C++)

一个整数 num 的 美丽值定义为 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;
    }
};

官方给的,喜欢喜欢

相关文章:

  • 面试题之强缓存协商缓存
  • javascript-es6 (六)
  • 从机器学习到生成式AI狂潮:AWS的AI征程从未停息
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-7.2.2自动扩缩容策略(基于HPA)
  • 2025年总结zabbix手动部署过程!
  • 【Python爬虫】使用python脚本拉取网页指定小说章节
  • [250310] Mistral 发布世界领先的文档理解 API:Mistral OCR | 谷歌利用 AI 保护自然的三种新方式
  • 可视化图解算法:反转链表
  • 《面向长尾分布的甲骨文识别算法设计与实现 》开题报告
  • 力扣hot100二刷——哈希、双指针、滑动窗口
  • C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用
  • 【gcc编译以及Makefile与GDB调试】
  • python LLM工具包
  • JavaScript数据类型和内存空间
  • 20-智慧社区物业管理平台
  • Java【多线程】(3)单例模式与线程安全
  • 大模型如何从开始到编译出Engine
  • [免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】
  • 一个简化版的进程内通信库实现
  • 深入理解Java中的static关键字及其内存原理
  • 国宝文物子弹库帛书二、三卷从美启程,18日凌晨抵京
  • 摄影师|伊莎贝尔·穆尼奥斯:沿着身体进行文化溯源
  • 下辖各区密集“联手”,南京在下一盘什么样的棋?
  • 梅花奖在上海|话剧《主角》:艺术与人生的交错
  • 中国进出口银行:1-4月投放制造业中长期贷款超1800亿元
  • 体坛联播|巴萨提前2轮西甲夺冠,郑钦文不敌高芙止步4强