开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
一、题目描述:
1295. 统计位数为偶数的数字 - 力扣(LeetCode)
给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数。
示例 1:
输入:nums = [12,345,2,6,7896]
输出:2
解释:
12 是 2 位数字(位数为偶数)
345 是 3 位数字(位数为奇数)
2 是 1 位数字(位数为奇数)
6 是 1 位数字 位数为奇数)
7896 是 4 位数字(位数为偶数)
因此只有 12 和 7896 是位数为偶数的数字
示例 2:
输入:nums = [555,901,482,1771]
输出:1
解释:
只有 1771 是位数为偶数的数字。
提示:
- 1 <= nums.length <= 500
- 1 <= nums[i] <= 10^5
二、思路分析:
需要创建一个与输入等大小的数组存储先前与之匹配位置上元素的位数,在通过判定是否是偶数从而实现数字个数的统计
三、AC 代码:
class Solution {
public:
int findNumbers(vector<int>& nums) {
int length = nums.size();
std::vector<int>ans(length,0);
for (int i = 0; i < length; ++i) {
int temp = 0;
while (nums[i] != 0){
nums[i] /= 10;
temp++;
}
ans[i] = temp;
}
int count = 0;
for (int i = 0; i < length; ++i) {
if (ans[i]%2==0)
count++;
}
return count;
}
};
四、总结:
题目要求是十进制数求位数,所以最先想到的思路就是依次除进制数10取商,然后再除,获取到做除法的次数即为位数, 此处可以使用递归,也可以使用for循环, 如果是其他进制数,只需要修改结束条件和除数. 题目给的条件 1< num < 10^5, 所以最多循环五次,不用考虑性能问题导致时间超时. 默认位数是值1 递归结束条件就是 是否 < 10,递归体就是将当前位和之前的位数求和.求解即可
参考
【javascript】统计位数为偶数的数字 - 统计位数为偶数的数字 - 力扣(LeetCode) (leetcode-cn.com)
将int转为String,调用.length,然后%2==0即为偶数 - 统计位数为偶数的数字 - 力扣(LeetCode) (leetcode-cn.com)