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 <= 500
  • 1 <= 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)只使用了常数级别的额外空间

相关题目