LeetCode 1295.统计位数为偶数的数字:模拟

【LetMeFly】1295.统计位数为偶数的数字:模拟

力扣题目链接:https://leetcode.cn/problems/find-numbers-with-even-number-of-digits/

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

解题方法一:正常模拟

如何判断一个(非负)数在十进制下有多少位?

当这个数不为0时拿这个数不断除以10,并将"数字位数"加一。

依次计算每个元素的位数,判断是否是偶数。

时空复杂度分析

  • 时间复杂度 O ( l e n ( n u m s ) × log ⁡ n u m s i ) O(len(nums)\times \log numsi) O(len(nums)×lognumsi)
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
cpp 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-04-30 17:23:40
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-04-30 17:25:14
 */
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endif

class Solution {
private:
    inline int getLength(int t) {
        int ans = 0;
        while (t) {
            ans++;
            t /= 10;
        }
        return ans;
    }
public:
    int findNumbers(vector<int>& nums) {
        int ans = 0;
        for (int t : nums) {
            ans += getLength(t) % 2 == 0;
        }
        return ans;
    }
};
Python
python 复制代码
'''
Author: LetMeFly
Date: 2025-04-30 17:24:34
LastEditors: LetMeFly.xyz
LastEditTime: 2025-04-30 17:26:24
'''
from typing import List

class Solution:
    def findNumbers(self, nums: List[int]) -> int:
        return sum(len(str(t)) % 2 == 0 for t in nums)
Java
java 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-04-30 17:24:37
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-04-30 17:27:07
 */
class Solution {
    private int getLength(int t) {
        int ans = 0;
        while (t > 0) {
            ans++;
            t /= 10;
        }
        return ans;
    }
    public int findNumbers(int[] nums) {
        int ans = 0;
        for (int t : nums) {
            if (getLength(t) % 2 == 0) {
                ans++;
            }
        }
        return ans;
    }
}
Go
go 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-04-30 17:24:40
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-04-30 17:28:26
 */
func findNumbers(nums []int) (ans int) {
    for _, t := range nums {
		cnt := 0
		for t > 0 {
			cnt++
			t /= 10
		}
		if cnt % 2 == 0 {
			ans++
		}
	}
	return
}

解题方法二:一次移除两位

方法一中我们将元素一次除以10(移除元素的一位),但是问题求的是"元素位数是否为偶数",那么我们为什么不可以在元素位数大于等于2的时候,一次移除两位呢?最后看元素剩下一位还是零位不就知道元素十进制下的位数是奇数还是偶数了吗。

时空复杂度分析

  • 时间复杂度 O ( l e n ( n u m s ) × log ⁡ n u m s i ) O(len(nums)\times \log numsi) O(len(nums)×lognumsi)
  • 空间复杂度 O ( 1 ) O(1) O(1)
C++
cpp 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-04-30 17:30:12
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-04-30 17:30:19
 */
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endif

class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int ans = 0;
        for (int t : nums) {
            while (t >= 10) {
                t /= 100;
            }
            ans += t == 0;
        }
        return ans;
    }
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
Jerry5 小时前
LeetCode 189. 轮转数组
算法
Jerry5 小时前
LeetCode 739. 每日温度
算法
2601_9545267510 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
叩码以求索11 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
c2385612 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa13 小时前
指针之总结
c语言·笔记·算法
宵时待雨14 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz14 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf21614 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp14 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu