leetcode:1295. 统计位数为偶数的数字

来源

leetcode

题目

在这里插入图片描述

解答

1:枚举 + 字符串

java

    // 位数为偶数:
    // 关键点:求一个数字有几位
    // 思路:将元素转为string类型的。就很方便了
    public static int findNumbers(int[] nums) {
        int count = 0;
        for (int i:nums ) {
            String t =  i + "";
            if (t.length() % 2 == 0){
                count++;
            }
        }

        return count;
    }

时间复杂度:O(N)O(N),其中 NN 是数组 nums 的长度。这里假设将整数转换为字符串的时间复杂度为 O(1)O(1)。

空间复杂度:O(1)O(1)。

c++

  • c++11
int findNumbers(vector<int>& nums) {
    int ans = 0;
    for (int num: nums) {
        if (to_string(num).size() % 2 == 0) {
            ++ans;
        }
    }
    return ans;
}
  • c++17
int findNumbers(vector<int>& nums) {
    return accumulate(nums.begin(), nums.end(), 0, [](int ans, int num){
        return ans + (to_string(num).size() % 2 == 0);
    });
}

2、枚举 + 数学

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

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

java

    public static int findNumbers(int[] nums) {
        int count = 0;
        for (int i:nums ) {
            int w = (int)Math.log10(i) + 1 ;
            if (w % 2 == 0){
                count++;
            }
        }
        return count;
    }

复杂度分析

时间复杂度:O(N),其中 NN 是数组 nums 的长度。

空间复杂度:O(1)。

C++

  • C++11
class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int ans = 0;
        for (int num: nums) {
            if ((int)(log10(num) + 1) % 2 == 0) {
                ++ans;
            }
        }
        return ans;
    }
};

  • C++17
int findNumbers(vector<int>& nums) {
    return accumulate(nums.begin(), nums.end(), 0, [](int ans, int num){
        return ans + ((int)(log10(num) + 1)% 2 == 0);
    });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值