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