2180. 统计各位数字之和为偶数的整数个数
2180. 统计各位数字之和为偶数的整数个数
题目
Given a positive integer num
, return the number of positive integers less than or equal to num
whose digit sums are even.
The digit sum of a positive integer is the sum of all its digits.
Example 1:
Input: num = 4
Output: 2
Explanation:
The only integers less than or equal to 4 whose digit sums are even are 2 and 4.>
Example 2:
Input: num = 30
Output: 14
Explanation:
The 14 integers less than or equal to 30 whose digit sums are even are
2, 4, 6, 8, 11, 13, 15, 17, 19, 20, 22, 24, 26, and 28.
Constraints:
1 <= num <= 1000
题目大意
给你一个正整数 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
到n
的所有数字。 - 对每个数字求数位之和。
- 如果数位之和是偶数,就把它计入结果。
复杂度分析
- 时间复杂度:
O(n * d)
,其中d
是数字的平均位数。 - 空间复杂度:
O(1)
,仅使用了常量变量。
代码
var countEven = function (n) {
let count = 0;
for (let i = 1; i <= n; i++) {
let sum = 0;
let num = i;
while (num > 0) {
sum += num % 10; // 提取每一位数字并加到 sum
num = Math.floor(num / 10); // 去掉最低位
}
if (sum % 2 === 0) {
// 判断数位和是否是偶数
count++;
}
}
return count;
};
/**
* @param {number} n
* @return {number}
*/
var countEven = function (n) {
return (n - (((n / 10) & 1) ^ ((n / 100) & 1) ^ (n / 1000))) >> 1;
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
1945 | 字符串转化后的各位数字之和 | [✓] | 字符串 模拟 | 🟢 | 🀄️ 🔗 |
2240 | 买钢笔和铅笔的方案数 | 数学 枚举 | 🟠 | 🀄️ 🔗 | |
2310 | 个位数字为 K 的整数之和 | 贪心 数学 动态规划 1+ | 🟠 | 🀄️ 🔗 | |
2553 | 分割数组中数字的数位 | 数组 模拟 | 🟢 | 🀄️ 🔗 | |
3232 | 判断是否可以赢得数字游戏 | 数组 数学 | 🟢 | 🀄️ 🔗 |