点击获取AI摘要

1295. 统计位数为偶数的数字 E

给你一个整数数组 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] <= 10510^5

算法思路

  1. 遍历:对输入数组 nums 中的每个数字 num 进行遍历(共 n 个)。
  2. 计数位数
    • 方法 A(数学方式):不断除以 10 直至 num 为 0,统计除法次数。
    • 方法 B(字符串方式):将 num 转为字符串 s = str(num),直接用 len(s) 获取位数。
  3. 判断奇偶:如果位数 digit_count % 2 == 0,则计数器加 1。
  4. 返回结果:遍历结束后输出计数器的值。

时间复杂度

方法 A:对每个数做除法操作,平均每个数的位数为 dd=O(log10(num))d = O(\log_{10}(num))),总体为 O(nd)O(n·d)

方法 B:字符串转换和长度计算也约为 O(nd)O(n·d)。 由于 num[i] ≤ 10510^5d ≤ 6,故可视为 线性 O(n)O(n)

空间复杂度:O(1)O(1)(忽略输出和输入空间)。

代码实现

1
2
3
4
5
6
7
8
9
10
11
from typing import List

class Solution:
def findNumbers(self, nums: List[int]) -> int:
count = 0
for num in nums:
# 方法 B:字符串方式统计位数
if len(str(num)) % 2 == 0:
count += 1
return count