统计位数为偶数的数字

标签: 数组

难度: 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

Submission

运行时间: 20 ms

内存: 16.0 MB

class Solution:
    def findNumbers(self, nums: List[int]) -> int:
        cnt=0
        for i in range(len(nums)):
            if len(str(nums[i]))%2==0:
                cnt+=1
        return cnt

Explain

题解的核心思路是遍历整数数组 nums,对于每个元素,将其转换为字符串以便计算其位数。接着检查该位数是否为偶数。如果是偶数,则累加计数器 cnt。最后,返回 cnt 作为结果,即位数为偶数的数字的总数。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def findNumbers(self, nums: List[int]) -> int:
        cnt = 0  # 初始化计数器
        for i in range(len(nums)):
            # 将数字转换为字符串,以便计算数字的位数
            if len(str(nums[i])) % 2 == 0:  # 如果位数为偶数
                cnt += 1  # 增加计数
        return cnt  # 返回位数为偶数的数字总数

Explore

是的,存在不需要将数字转换为字符串来计算位数的方法。可以通过连续除以10直到数字变为0的方式来计数,每次除法操作相当于去掉数字的最后一位。例如,数字1234除以10变为123,再除以10变为12,继续这样操作直到结果为0,期间的除法操作次数即为原数字的位数。这种方法避免了字符串转换,可能在某些情况下更高效。

在当前的算法框架下,使用if语句来检查位数是否为偶数是直接且有效的方法。然而,如果我们采用数学方法(如前一个答案中提到的除法计数法)来直接计算位数,然后再判断其奇偶性,可以避免字符串的转换与处理,可能会略微提升效率。但总体来说,改动的效率提升可能不大,因为核心操作(位数计算和奇偶判断)本身复杂度不高。

本算法的时间复杂度主要是O(n),其中n是数组nums的长度。在处理极大量数据时,算法的执行时间将线性增长。然而,当数组长度极大(接近或达到Python整数的最大值)时,可能会遇到内存限制或处理时间过长的问题。实际上,在Python中处理如此大的数据集通常需要考虑使用更高效的数据处理技术或分布式处理系统。

在本题的算法中,数组中数字的大小不直接影响算法的时间复杂度,因为每个数字无论其大小如何,都需要转换为字符串并计算长度或通过数学方法计算位数。这些操作的时间复杂度与数字的具体大小关系不大。因此,即使数组中数字大小差异较大,也不会对算法的效率产生显著影响。