C/C++题解LeetCode1295统计位数为偶数的数字
刘09k11 人气:0题目描述
1295. 统计位数为偶数的数字 - 力扣(LeetCode)
给你一个整数数组 nums
,请你返回其中位数为 偶数 的数字的个数。
示例 1:
输入:nums = [12,345,2,6,7896] 输出:2 解释: 12 是 2 位数字(位数为偶数) 345 是 3 位数字(位数为奇数) 2 是 1 位数字(位数为奇数) 6 是 1 位数字 位数为奇数) 7896 是 4 位数字(位数为偶数) 因此只有 12 和 7896 是位数为偶数的数字
示例 2:
输入:nums = [555,901,482,1771] 输出:1 解释: 只有 1771 是位数为偶数的数字。
提示:
1 <= nums.length <= 500
1 <= nums[i] <= 10^5
思路分析
题目要求是十进制数求位数,所以最先想到的思路就是依次除进制数10取商,然后再除,获取到做除法的次数即为位数
此处可以使用递归,也可以使用for循环, 如果是其他进制数,只需要修改结束条件和除数
题目给的条件 1< num < 10^5, 所以最多循环五次,不用考虑性能问题导致时间超时
默认位数是值1 递归结束条件就是 是否 < 10,递归体就是将当前位和之前的位数求和.求解即可
利用to_string函数可以将整数转换成字符串
然后用string类自带的求长度函数可以求出有几位
然后直接对2求余就知道是奇数还是偶数了。
AC 代码
class Solution { public: int getLengthOfNumber (int num) { int lenght = 1; if (num < 10) { return lenght; } num = num / 10; lenght = getLengthOfNumber(num) + lenght; return lenght; } int findNumbers(vector<int>& nums) { int num = 0; int length = (int)nums.size(); for (int i = 0 ; i < length; i++) { int length = getLengthOfNumber(nums[i]); if (length % 2 == 0) { num++; } } return num; } };
class Solution { public: int findNumbers(vector<int>& nums) { int count = 0; for(auto v : nums) { string x = to_string(v); if(x.size()%2 == 0) count++; } return count; } };
将int转为String
调用.length,然后%2==0即为偶数 - 统计位数为偶数的数字
代码
class Solution { public int findNumbers(int[] nums) { int res=0; for(int i:nums){ if(String.valueOf(i).length()%2==0){ res++; } } return res; } }
3种方法 - 统计位数为偶数的数字
1. 把数字转成字符串
public int findNumbers(int[] nums) { int count = 0; for (int i = 0; i < nums.length; i++) { if (String.valueOf(nums[i]).length() % 2 == 0) { count++; } } return count; }
2. 数字循环除10,统计等于0的时候除10的次数,偶数次则该数为偶数位
public int findNumbers(int[] nums) { int count = 0; for (int i = 0; i < nums.length; i++) { int N = nums[i]; //记录除10的次数 int countTen = 0; while (N != 0) { N/=10; countTen++; } //如果除10的次数是偶数次,则该数为偶数位数 if (countTen % 2 == 0) { count++; } } return count; }
3. 已知范围为1 <= nums[i] <= 10^5,所以只有两个区间内的数为偶数位10~99以及1000~9999
public int findNumbers(int[] nums) { int count=0; for(int i=0;i<nums.length;++i){ if((nums[i]>=10&&nums[i]<100)||(nums[i]>=1000&&nums[i]<10000)) count++; } return count; }
加载全部内容