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

180 阅读2分钟

「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」。

题目描述:

1295. 统计位数为偶数的数字 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数。

示例一

输入:nums = [12,345,2,6,7896]
输出:2
解释:
12  2 位数字(位数为偶数) 
345  3 位数字(位数为奇数)  
2  1 位数字(位数为奇数) 
6  1 位数字 位数为奇数) 
7896  4 位数字(位数为偶数)  
因此只有 12  7896 是位数为偶数的数字

示例二

输入: nums = [555,901,482,1771]
输出: 1 
解释:
只有 1771 是位数为偶数的数字。

提示:

  • 1 <= nums.length <= 500
  • 1 <= nums[i] <= 10^5

思路分析

遍历 + 字符串

很明显遍历是逃不掉的,要求数字的位数,有个简单的办法就是利用sdk的方法,数字转为string之后,求得string的长度即可。

AC代码

class Solution {
    fun findNumbers(nums: IntArray): Int {
        var ans = 0
        for (i in nums){
            if (i.toString().length%2==0){
              ans++
            }
        }
        return ans
    }
}

数学法

这个是看了官解的,直接摘抄下了

我们也可以使用语言内置的以 1010 为底的对数函数 log10()log10() 来得到整数 x 包含的数字个数。

一个包含 k 个数字的整数 x 满足不等式 10k1x<10k10^{k-1} \leq x < 10^k 将不等式取对数,得到 k1log10(x)<kk - 1 \leq \log_{10}(x) < k,因此我们可以用 k=log10(x)+1k = \lfloor\log_{10}(x) + 1\rfloor得到 x 包含的数字个数 k,其中 a\lfloor a \rfloor 表示将 aa 进行下取整,例如 5.2=5\lfloor 5.2 \rfloor = 5

AC代码

class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int ans = 0;
        for (int num: nums) {
            if (to_string(num).size() % 2 == 0) {
                ++ans;
            }
        }
        return ans;
    }
};

总结

虽然是简单题,但是解法还是蛮多的,还可以通过不断除以10,看结果为0的时候除以的次数来判断,也算是数学法吧。

参考

统计位数为偶数的数字 - 统计位数为偶数的数字 - 力扣(LeetCode) (leetcode-cn.com)

Kotlin解法 - 统计位数为偶数的数字 - 力扣(LeetCode) (leetcode-cn.com)

【C++】统计位数为偶数的数字(3种方法实现) - 统计位数为偶数的数字 - 力扣(LeetCode) (leetcode-cn.com)