1. 题目 (58)统计能整除数字的位数
题目链接:统计能整除数字的位数
给你一个整数 num ,返回 num 中能整除 num 的数位的数目。
如果满足 nums % val == 0 ,则认为整数 val 可以整除 nums 。
-
示例 1:
输入:num = 7
输出:1
解释:7 被自己整除,因此答案是 1 。 -
示例 2:
输入:num = 121
输出:2
解释:121 可以被 1 整除,但无法被 2 整除。由于 1 出现两次,所以返回 2 。 -
示例 3:
输入:num = 1248
输出:4
解释:1248 可以被它每一位上的数字整除,因此答案是 4 。
提示:
1 <= num <= 109
num 的数位中不含 0
2. 解题思路
- 声明一个变量tmp,用于存储原始的输入数值num。
- 声明一个变量sum,用于累计能整除num本身的数字个数。
- 使用while循环,条件为tmp的值不等于0。
- 在循环中,通过求余操作(tmp % 10)来获取num的最后一位数字,并将其与num本身进行取模操作(num % (tmp % 10))。
- 如果取模结果等于0,说明该数字可以整除num本身,将sum自增1。
- 将tmp除以10,舍去最后一位数字,以处理下一位数字。
- 循环执行以上步骤,直到将num的所有位数处理完毕。
- 返回sum作为函数的输出结果。
3. 代码
int countDigits(int num) {
int tmp = num;//拷贝一份num
int sum = 0;
while(tmp) {
//将tmp的每一位取下来,算一下能否整除num
if(num%(tmp%10)==0) {
++sum;
}
tmp/=10;
}
return sum;
}
4. 题目 (59)重新排列数组
题目链接:重新排列数组
给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。
请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。
-
示例 1:
输入:nums = [2,5,1,3,4,7], n = 3
输出:[2,3,5,4,1,7]
解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7] -
示例 2:
输入:nums = [1,2,3,4,4,3,2,1], n = 4
输出:[1,4,2,3,3,2,4,1] -
示例 3:
输入:nums = [1,1,2,2], n = 2
输出:[1,2,1,2]
提示:
1 <= n <= 500
nums.length == 2n
1 <= nums[i] <= 10^3
5.解题思路
- 使用malloc函数为洗牌结果数组arr分配内存空间,大小为2n。
- 声明两个指针p1和p2,分别指向数组nums的前半部分和后半部分。
- 声明两个计数器j和k,分别用于遍历指针p1和p2所指向的元素。
- 使用for循环遍历数组nums的所有元素。
- 对于奇数索引(i的值为偶数),将指针p1所指向的元素赋值给洗牌结果数组arr的当前位置,并将计数器j自增1。
- 对于偶数索引(i的值为奇数),将指针p2所指向的元素赋值给洗牌结果数组arr的当前位置,并将计数器k自增1。
- 循环执行以上步骤,直到遍历完所有元素。
6. 代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
int* arr = (int*)malloc(sizeof(int)*2*n);
int *p1 = nums;
int *p2 = nums+n;
int j = 0,k=0;
for(int i = 0;i<numsSize;i++) {
if(0 == i%2)
{
arr[i] = p1[j];
j++;
}
else
{
arr[i] = p2[k];
k++;
}
}
*returnSize = numsSize;
return arr;
}