Easy
题目描述
给你一个整数数组 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 <= 5001 <= nums[i] <= 10^5
提示:
- 如何计算一个数字的位数?
- 不断将数字除以 10 来获得位数。
解题思路
解题思路
这道题要求统计数组中位数为偶数的数字个数。关键是如何计算一个数字的位数。
方法一:数学方法(推荐)
通过不断除以 10 来计算位数。对于每个数字,我们用一个循环,每次将数字除以 10,直到数字变为 0,循环次数就是位数。然后判断位数是否为偶数。
方法二:字符串转换
将数字转换为字符串,字符串的长度就是位数。这种方法代码更简洁,但理论上性能略差于数学方法。
方法三:对数方法
使用 log10(n) + 1 来计算位数,但需要处理边界情况,实际使用较少。
数学方法是最直观且高效的解法,时间复杂度为 O(n×d),其中 d 是数字的平均位数,空间复杂度为 O(1)。
代码实现
class Solution {
public:
int findNumbers(vector<int>& nums) {
int count = 0;
for (int num : nums) {
int digits = 0;
int temp = num;
while (temp > 0) {
digits++;
temp /= 10;
}
if (digits % 2 == 0) {
count++;
}
}
return count;
}
};
class Solution:
def findNumbers(self, nums: List[int]) -> int:
count = 0
for num in nums:
digits = 0
temp = num
while temp > 0:
digits += 1
temp //= 10
if digits % 2 == 0:
count += 1
return count
public class Solution {
public int FindNumbers(int[] nums) {
int count = 0;
foreach (int num in nums) {
int digits = 0;
int temp = num;
while (temp > 0) {
digits++;
temp /= 10;
}
if (digits % 2 == 0) {
count++;
}
}
return count;
}
}
var findNumbers = function(nums) {
return nums.filter(num => num.toString().length % 2 === 0).length;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n×d) | n 是数组长度,d 是数字的平均位数(约为 log₁₀(max_value)) |
| 空间复杂度 | O(1) | 只使用了常数级别的额外空间 |