Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LeetCode] 1295. Find Numbers with Even Number of Digits #1295

Open
grandyang opened this issue May 30, 2019 · 0 comments
Open

[LeetCode] 1295. Find Numbers with Even Number of Digits #1295

grandyang opened this issue May 30, 2019 · 0 comments

Comments

@grandyang
Copy link
Owner

grandyang commented May 30, 2019

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 同步地址:

#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 题目讲解汇总(持续更新中...)

(欢迎加入博主的知识星球,博主将及时答疑解惑,并分享刷题经验与总结,快快加入吧~)

知识星球 喜欢请点赞,疼爱请打赏❤️~.~

微信打赏

|

Venmo 打赏


---|---

@grandyang grandyang changed the title [LeetCode] 1295. Missing Problem [LeetCode] 1295. Find Numbers with Even Number of Digits Nov 21, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant