[LeetCode] 1295. Find Numbers with Even Number of Digits 统计位数为偶数的数字


Given an array nums of integers, return how many of them contain an even number of digits.

Example 1:

Input: nums = [12,345,2,6,7896]
Output: 2
Explanation: 12 contains 2 digits (even number of digits). 
345 contains 3 digits (odd number of digits). 
2 contains 1 digit (odd number of digits). 
6 contains 1 digit (odd number of digits). 
7896 contains 4 digits (even number of digits). 
Therefore only 12 and 7896 contain an even number of digits.

Example 2:

Input: nums = [555,901,482,1771]
Output: 1
Explanation:
Only 1771 contains an even number of digits.

Constraints:

  • 1 <= nums.length <= 500
  • 1 <= nums[i] <= 105

这道题给了一个数组,让找出多少个偶数位的数字,所谓偶数位的数字,就是说该多位数要有偶数个位,比如个数位就不是偶数位数字,而十位数就是。其实这道题就是考察如何统计整数的位数,比较简单直接的方法就是进行一个 while 循环,每次都除以 10,直到原数字变为0为止,这样就知道位数了。可以对数组中的每个数字都进行如下的操作,就可以知道是否是偶数位的数字了,参见代码如下:


解法一:

class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int res = 0;
        for (int num : nums) {
            int cnt = 0;
            while (num > 0) {
                ++cnt;
                num /= 10;
            }
            res += (cnt % 2 == 0);
        }
        return res;
    }
};

再来看一种比较高级的解法,运用到了对数计算,数字进行以10为底的对数运算,若得到奇数,则表示原数字是偶数位的,这样就省去了 while 循环的操作,可以进行快速的判断,参见代码如下:


解法二:

class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int res = 0;
        for (int num : nums) {
            res += (int)log10(num) & 1;
        }
        return res;
    }
};

再来看一种涉嫌 cheating 的解法,由于题目中给定了数字的范围,不超过 10^5,那么偶数位的数字其实是有固定的范围的,分别为 [10, 99],[1000, 9999],和 100000,只要对这些范围进行直接判断,就知道是否是偶数位了,参见代码如下:


解法三:

class Solution {
public:
    int findNumbers(vector<int>& nums) {
        int res = 0;
        for (int num : nums) {
            if ((num > 9 && num < 100) || (num > 999 && num < 10000) || num == 100000) ++res;
        }
        return res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1295


类似题目:

Finding 3-Digit Even Numbers


参考资料:

https://leetcode.com/problems/find-numbers-with-even-number-of-digits/

https://leetcode.com/problems/find-numbers-with-even-number-of-digits/discuss/521567/C%2B%2B-solution-with-log-and-bit-manipulation

https://leetcode.com/problems/find-numbers-with-even-number-of-digits/discuss/459489/JAVA-solution-with-100-better-space-and-Time


LeetCode All in One 题目讲解汇总(持续更新中...)

posted @ 2022-04-24 01:22  Grandyang  阅读(211)  评论(0编辑  收藏  举报
Fork me on GitHub