LC 1295.Find Numbers with Even Number of Digits

题目描述

这是 LeetCode 上的 1295. 统计位数为偶数的数字 ,难度为简单

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

示例 1:

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

示例 2:

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

提示:

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

解答

方法一:枚举 + 字符串

遍历 nums 中的每一个数字 num ,然后转化为字符串,判断字符串的长度就可以确定奇偶性。

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int findNumbers(int[] nums) {
int res = 0;
for (var num : nums) {
if ((Integer.toString(num).length() & 1) == 0) {
++res;
}
}
return res;
}
}
  • 时间复杂度\(O(n)\),其中 nnums 数组的长度,这里假设 Integer.toString() 的时间复杂度为 \(O(1)\)

  • 空间复杂度\(O(1)\),使用了常数个变量。

方法二:枚举 + 数学

也可以用内置函数 Math.log10() 来得到数字的位数。

一个包含 k 个数字的整数 x 满足不等式 \(10^{k - 1} \leq x < 10^{k}\)。将不等式取对数,得到 \(k - 1 \leq \log_{10}(x) < k\) ,因此可以用 \(k = \lfloor \log_{10}(x) + 1 \rfloor\) 得到 x 包含的数字个数 k ,其中 \(\lfloor a \rfloor\) 表示将 a 向下取整,比如 \(\lfloor 5.2 \rfloor = 5\)

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int findNumbers(int[] nums) {
int res = 0;
for (var num : nums) {
if (((int) (Math.log10(num) + 1) & 1) == 0) {
++res;
}
}
return res;
}
}
  • 时间复杂度\(O(n)\),其中 nnums 数组的长度。
  • 空间复杂度\(O(1)\)

每题一图


LC 1295.Find Numbers with Even Number of Digits
https://chen-huaneng.github.io/2023/12/11/2023-12-11-2023-12-11-lc-1295/
作者
Abel
发布于
2023年12月11日
更新于
2023年12月11日
许可协议