LeetCode答题记录233. 数字1的个数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode答题记录233. 数字1的个数相关的知识,希望对你有一定的参考价值。

参考技术A

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。

解法:递归求解。
1、计算最高位出现数字1的次数;if:最高位大于1 次数为 10的k次方,k是最高位的位数,等于1:次数为 n-k+1。
2、计算次高位:去掉最高位,计算剩余部分出现数字1的次数。计算方式见下详解
3、当入参位数为1位即 n < 10 时返回1。
这个过程递归,即可求出最终结果

第二步详解:例子n = 2345. 相当于计算0 999的百位出现1的次数+1000 1999百位出现1的次数+2000~2345百位出现1的次数
也就是0~999百位为1的次数 * 2 + 0~345百位为1的次数

LeetCode 2180. 统计各位数字之和为偶数的整数个数

【LetMeFly】2180.统计各位数字之和为偶数的整数个数

力扣题目链接:https://leetcode.cn/problems/count-integers-with-even-digit-sum/

给你一个正整数 num ,请你统计并返回 小于或等于 num 且各位数字之和为 偶数 的正整数的数目。

正整数的 各位数字之和 是其所有位上的对应数字相加的结果。

 

示例 1:

输入:num = 4
输出:2
解释:
只有 2 和 4 满足小于等于 4 且各位数字之和为偶数。    

示例 2:

输入:num = 30
输出:14
解释:
只有 14 个整数满足小于等于 30 且各位数字之和为偶数,分别是: 
2、4、6、8、11、13、15、17、19、20、22、24、26 和 28 。

 

提示:

  • 1 <= num <= 1000

方法一:遍历模拟

我们只需要从1到num遍历一遍(使用变量i来遍历),对于每个正在遍历的数,统计这个数在十进制下的各位数之和(如果是偶数则答案数量加一)

怎么计算一个数在十进制下每一位之和呢?

很简单,在这个数不为0时,不断取出这个数的个位(这个数对10取模),然后将这个数除以10(并向下取整)即可(这样相当于是丢掉了各个位)。

// 统计thisNum在十进制下的各位数之和
int cnt = 0;
while (thisNum) 
    cnt += thisNum % 10;
    thisNum /= 10;

ans += cnt % 2 == 0;
  • 时间复杂度 O ( n u m × log ⁡ ( n u m ) ) O(num\\times \\log(num)) O(num×log(num))
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

class Solution 
public:
    int countEven(int num) 
        int ans = 0;
        for (int i = 1; i <= num; i++) 
            int cnt = 0, thisNum = i;
            while (thisNum) 
                cnt += thisNum % 10;
                thisNum /= 10;
            
            ans += cnt % 2 == 0;
        
        return ans;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/128583772

以上是关于LeetCode答题记录233. 数字1的个数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:233.数字1的个数

LeetCode(算法)- 233. 数字 1 的个数

LeetCode(算法)- 233. 数字 1 的个数

LeetCode 233 数字1的个数[数学 找规律] HERODING的LeetCode之路

Leetcode 233 Number of Digit One

LeetCode233. 数字1的个数(数位dp)/1583. 统计不开心的朋友(模拟)/112. 路径总和 / 230. 二叉搜索树中第K小的元素 /968. 监控二叉树(树形dp)