难度:⭐
题目描述:
给你一个整数数组 nums
,请你返回其中位数为 偶数 的数字的个数。
示例1:
1 | 输入:nums = [12,345,2,6,7896] |
示例2:
1 | 输入:nums = [555,901,482,1771] |
提示:
1 <= nums.length <= 500
1 <= nums[i] <= 10^5
解题过程:
思路:
1、因为1<=nums[i]<=10^5
,所以位数为偶数只能有三种情况
- 6位数,nums[i]等于100000
- 4位数,0<nums[i]/1000<10
- 2位数,0<nums[i]/10<10
对这三种情况的数字进行计数即可。
2、另外也可以遍历数组,判断每一个整数的位数
c++代码:(执行用时8ms,击败96.89%,内存消耗10M,击败17.69%)
1 | class Solution { |
官方题解:
方法一:枚举 + 字符串
我们枚举数组 nums
中的整数,并依次判断每个整数 x
是否包含偶数个数字。
一种简单的方法是使用语言内置的整数转字符串函数,将 x
转换为字符串后,判断其长度是否为偶数即可。
c++代码:(执行16ms,击败43.91%,内存10M,击败12.53%)
1 | class Solution { |
复杂度分析
时间复杂度:$O(N)$,其中 $N$ 是数组
nums
的长度。这里假设将整数转换为字符串的时间复杂度为 $O(1)$。空间复杂度:$O(1)$。
方法二:枚举 + 数学
我们也可以使用语言内置的以 10
为底的对数函数 log10()
来得到整数 x
包含的数字个数。
一个包含 k
个数字的整数 x
满足不等式 $10^{k-1} ≤x<10^k$ 。将不等式取对数,得到 $k - 1 \leq \log_{10}(x) < k$,因此我们可以用 $k = \lfloor\log_{10}(x) + 1⌋$得到 x
包含的数字个数 k
,其中 $\lfloor a ⌋$表示将 $a$ 进行下取整,例如 $\lfloor 5.2 \rfloor$ = 5⌊5.2⌋=5。
c++代码:(执行20ms,击败16.37%,内存10.4M,击败5.09%)
1 | class Solution { |
总结:
题目多种解法,官方题解第一种即是我思路里的第二种方法,也挺好不错。