1.(38)找出数组的最大公约数
题目链接:找出数组的最大公约数
给你一个整数数组 nums ,返回数组中最大数和最小数的 最大公约数 。
两个数的 最大公约数 是能够被两个数整除的最大正整数。
-
示例 1:
输入:nums = [2,5,6,9,10]
输出:2
解释:
nums 中最小的数是 2
nums 中最大的数是 10
2 和 10 的最大公约数是 2 -
示例 2:
输入:nums = [7,5,6,8,3]
输出:1
解释:
nums 中最小的数是 3
nums 中最大的数是 8
3 和 8 的最大公约数是 1 -
示例 3:
输入:nums = [3,3]
输出:3
解释:
nums 中最小的数是 3
nums 中最大的数是 3
3 和 3 的最大公约数是 3
提示:
2 <= nums.length <= 1000
1 <= nums[i] <= 1000
2. 解题思路
一步一步来,先找最大最小值,再求两数的最大公约数
3. 代码
int findGCD(int* nums, int numsSize) {
int min = nums[0];
int max = nums[0];
//找最大和最小值
for(int i=1;i<numsSize;i++)
{
if(min > nums[i])
min = nums[i];
if(max < nums[i])
max = nums[i];
}
//求最大公约数,辗转相除法
int tmp = 0;
while(tmp = max%min)
{
max = min;
min = tmp;
}
return min;//返回最大公约数
}
4.(39)统计位数为偶数的数字
题目链接:统计位数为偶数的数字
给你一个整数数组 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
5. 解题思路
某个数被除10后不为0的次数就是该数的位数
6. 代码
int findNumbers(int* nums, int numsSize) {
int sum = 0;
for(int i=0;i<numsSize;i++)
{
int tmp = 0;
while(nums[i])
{
nums[i]/=10;
tmp++;
}
if(0 == tmp%2)
sum++;
}
return sum;
}
7.(40)分隔数组中数字的数位
题目链接:分隔数组中数字的数位
给你一个正整数数组 nums ,请你返回一个数组 answer ,你需要将 nums 中每个整数进行数位分割后,按照 nums 中出现的 相同顺序 放入答案数组中。
对一个整数进行数位分割,指的是将整数各个数位按原本出现的顺序排列成数组。
比方说,整数 10921 ,分割它的各个数位得到 [1,0,9,2,1] 。
-
示例 1:
输入:nums = [13,25,83,77]
输出:[1,3,2,5,8,3,7,7]
解释:
- 分割 13 得到 [1,3] 。
- 分割 25 得到 [2,5] 。
- 分割 83 得到 [8,3] 。
- 分割 77 得到 [7,7] 。
answer = [1,3,2,5,8,3,7,7] 。answer 中的数字分割结果按照原数字在数组中的相同顺序排列。 -
示例 2:
输入:nums = [7,1,3,9]
输出:[7,1,3,9]
解释:nums 中每个整数的分割是它自己。
answer = [7,1,3,9] 。
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 105
8. 解题思路
求每个元素的倒序数,之后再一位一位的放入数组中
9. 代码
int* separateDigits(int* nums, int numsSize, int* returnSize) {
int * arr = (int*)malloc(sizeof(int)*10000);
int i=0;
int j = 0;
for(i=0;i<numsSize;i++)
{
//记录数字末尾有几个0
int k = 0;
while(nums[i]%10==0)
{
nums[i]/=10;
k++;
}
//求该数字的倒序数
int tmp = 0;
while(nums[i])
{
tmp = tmp*10 + nums[i]%10;
nums[i]/=10;
}
//将数字的每一位放入数组中
while(tmp)
{
arr[j++] = tmp%10;
tmp/=10;
}
while(k--)//将原来数组的0放进去
arr[j++] = 0;
}
*returnSize = j;//返回数组大小
return arr;
}