统计位数为偶数的数字
给你⼀个整数数组 nums ,请你返回其中位数为 偶数 的数字的个数。
• ⽰例 1:
输⼊:nums = [12,345,2,6,7896]
输出:2
解释: 12 是 2 位数字(位数为偶数)
345 是 3 位数字(位数为奇数)
2 是 1 位数字(位数为奇数)
6 是 1 位数字 位数为奇数)
7896 是 4 位数字(位数为偶数)
因此只有 12 和 7896 是位数为偶数的数字
算法思路:
1. 定义⼀个变量 ans ,并将其初始化为0;
2. 遍历数组中每个数,计算当前数被10除不为0的次数,即当前数的位数;
3. 当位数为偶数时 ans 的值加⼀;
4. 返回 ans 。
解法⼀(模拟):
某个数被10相除不为0的次数即为它的位数。
代码:
int count(int num) {
int n = 0;
//因为题⽬中的数据为正数,所以不⽤特判0的情况,直接计算位数
while (num) {
n++;
num /= 10;
}
return n;
}
int findNumbers(int* nums, int numsSize) {
int i = 0;
int ans = 0;
//遍历数组
for (i = 0; i < numsSize; i++) {
//如果位数是2的倍数,则位数为偶数,记录次数
if (count(nums[i]) % 2 == 0) {
ans++;
}
}
//返回答案
return ans;
}
解法⼆(sprintf()函数):
利⽤ sprintf 函数将数字转化为字符串形式,则字符串⻓度即为数字位数。
• sprintf函数: sprintf函数是⼀个C标准库函数,⽤于将格式化的数据写⼊⼀个字符串中。它的函数原型为:
int sprintf(char *str, const char *format, ...);
其中,第⼀个参数str是⼀个字符指针,指向⽤于存储输出的字符数组,第⼆个参数format是⼀个字 符串,包含要写⼊字符数组的⽂本和格式控制字符,后⾯的省略号表⽰可选的参数,⽤于填充格式控 制字符中的占位符。
sprintf函数的⼯作⽅式类似于printf函数,不同之处在于它将输出写⼊到⼀个字符串中⽽不是标准输 出。它返回写⼊到字符数组中的字符数,不包括字符串的结尾空字符'\0'。如果出现错误,则返回负 数。
• 求字符串 str ⻓度:字符串函数strlen: 字符串str⻓度=strlen(str)。
算法思路:
1. 定义⼀个变量 ans ,将其初始化为0;
2. 定义⼀个字符串数组 arr ;
3. 遍历原数组,将当前数字利⽤ sprintf 函数转化为字符串形式放⼊字符串数组;
4. 求字符串⻓度,当⻓度为偶数时 ans 的值加⼀;
5. 返回 ans 。
代码:
int findNumbers(int* nums, int numsSize) {
int i = 0;
int ans = 0;
//定义字符串数组⽤来存放转化后的字符串
char arr[7] ;
for (i = 0; i < numsSize; i++) {
//将数字转化为字符串
sprintf(arr, "%d", nums[i]);
//字符串⻓度为偶数,即当前数字位数为偶数时记录⼀次
if (strlen(arr) % 2 == 0) {
ans++;
}
}
//返回答案
return ans;
}