来源
题目
解答
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 10k−1≤x<10k 。
- 将不等式取对数,得到 k − 1 ≤ log 10 ( x ) < k k - 1 \leq \log_{10}(x) < k k−1≤log10(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);
});
}