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

385 阅读1分钟

题目 leetcode.cn/

  • 给你一个正整数 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

代码

function countEven(num: number): number {
    let sum = 0;
    for(let i = 1; i <= num; i++){
        if(i < 10 && i % 2 === 0){
            sum++;
        }
        if(i > 10 && i < 100){
            let m = Math.floor(i / 10);
            let n = i % 10;
            if((m + n) % 2 === 0){
                sum++;
            }
        }
        if(i > 100 && i < 1000){
            let m = Math.floor(i / 100);
            let n = i % 10;
            let k = Math.floor(i / 10) % 10;
            if((m + n + k) % 2 === 0){
                sum++;
            }
        }
    }
    return sum;
};
  • 取值判断:
    • 给定的num范围是1-1000,就可以按照位数来区分,把每一位上的数字取出来相加,再判断是否是偶数。但是如果取值范围过大,这种就显得十分麻烦,代码量增多。
    • 但对于本题范围内取值,判断取值节省时间和内存成本
function countEven(num: number): number {
    let sum = 0;
    for(let i = 1; i <= num; i++){
        let count = 0;
        let no = i;
        while(no !== 0){
            count += no % 10;
            no = Math.floor(no / 10);
        }
        if(count % 2 === 0){
            sum++
        }
    }
    return sum;
};
  • 位数遍历:
    • 这一种就比较通用了,无论你的取值多少,都可以解决每一位的取值。将给到的数字每一位上的数字依次取出累加,如果和是偶数则统计
    • 相较于本题的范围来说,时间和空间开销略大

结果:

  • 取值判断:

image.png

  • 位数遍历:

image.png