【C语言】初阶算法相关习题(一)
个人主页
文章目录
- ⭐一、数字在升序数组中出现的次数
- 🏠二、整数转换
- 🚀三、至少是其他数字两倍的最大数
- 🏝️四、字符个数的统计
- 🎄五、自除数
- 🎡六、除自身以外数组的乘积
- 🎉七、两个数组的交集
⭐一、数字在升序数组中出现的次数
题目描述:数字在升序数组中出现的次数
解题思路:由于数组是升序的,所以我们可以直接采用暴力的方法,遍历数组,统计数组中出现这个数字的次数即可解决。
代码实现:
int GetNumberOfK(int* nums, int numsLen, int k ) {// write code hereint i = 0;int count = 0;for(i=0;i<numsLen;i++){if(nums[i] == k){count++;}}return count;
}
🏠二、整数转换
题目描述:整数转换
解题思路:
1.使用异或即相同为0相异为1,将AB进行异或得到AB在哪些位置不同
2.然后将将异或后的结果二进制每一位都按位与1,每完成一次就右移一位,用count来统计最低位是否为1的次数,最终count的结果就是不同位置的个数
代码实现:
int convertInteger(int A, int B) {int c = A ^ B;int count = 0;int i = 0;for(i=0;i<32;i++){if((c & 1) == 1){count++;}c >>= 1;}return count;
}
🚀三、至少是其他数字两倍的最大数
题目描述:至少是其他数字两倍的最大数
解题思路:
1.创建一个max变量表示最大值,secondmax表示次大值,m用于记录最大值的下标。
2.遍历数组,如果当前值大于 max,更新 secondmax 为原来的 max,并将 max 更新为当前值,同时记录最大值的索引m。否则,如果当前值大于 secondmax,更新 secondmax。
3.遍历结束后,判断 max 是否大于等于 2 × secondmax,并根据条件返回结果。
代码实现:
int dominantIndex(int* nums, int numsSize) {int max = 0;int secondmax = 0;//记录最大值的下标int m = 0;for(int i = 0;i<numsSize;i++){if(nums[i] > max){secondmax = max;max = nums[i];m = i;}else if(nums[i] > secondmax){secondmax = nums[i];}}return (max >= (2 * secondmax)) ? m:-1;
}
🏝️四、字符个数的统计
题目描述:字符个数的统计
解题思路:
1.定义一个字符数组 a 用于存储输入的字符串。
2.定义一个辅助数组 str,大小为 128,用于记录每个字符是否出现过。
3.使用 strlen函数 获取输入字符串的长度。
4.遍历输入字符串的每个字符,利用 str 数组记录字符的出现情况,并统计不同字符的数量,统计完后将改位置的值设为1,避免重复计算。
5.最后输出统计结果即可。
代码实现:
#include <stdio.h>
#include <string.h>int main() {char a[500];char str[128] = {0};int count = 0;scanf("%s",a);int len = strlen(a);for(int i = 0;i<len;i++){if(str[a[i]] == 0){count++;str[a[i]] = 1;}}printf("%d\n",count);return 0;
}
🎄五、自除数
题目描述:自除数
解题思路:
1.由题可知返回值是以数组的形式,因此创建一个数组result,大小为(right-left+1)
2.使用循环语句,对left和right之间的元素一一进行判断(使用jungeNumber函数)
3.jungeNumber函数:对于一个数进行判断,使用while语句进行,用flag求得被除数,每进行一次取余的判断,tmp就除10,出循环后说明该数是自除数。
代码实现:
bool jungeNumber(int nums)
{int tmp,flag;tmp = nums;while(tmp > 0){flag = tmp % 10;if(flag == 0 || nums % flag != 0){return false;}tmp /= 10;}return true;
}int* selfDividingNumbers(int left, int right, int* returnSize) {int* result = (int*)malloc(sizeof(int) * (right - left + 1));int count = 0;for(int i = left;i <= right;i++){if(jungeNumber(i)){result[count] = i;count++;}}*returnSize = count;return result;
}
🎡六、除自身以外数组的乘积
题目描述:除自身以外数组的乘积
解题思路:
1.创建一个大小为numSize的数组,用于存储最终结果。
2.初始化 left 和 right 为 1,分别用于记录左边和右边的乘积。
3.先从左到右遍历数组,计算每个位置的左边乘积并存储到 result 中。
4.再从右到左遍历数组,计算每个位置的右边乘积并与 result 中的值相乘,得到最终结果。
5.最后返回 result 数组。
代码实现:
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int* result = (int*)malloc(sizeof(int) * numsSize);*returnSize = numsSize;//先乘左边的,再乘右边的int left = 1,right = 1;for(int i = 0;i<numsSize;i++){result[i] = left;left *= nums[i];}for(int i = numsSize - 1;i>=0;i--){result[i] *= right;right *= nums[i];}return result;
}
🎉七、两个数组的交集
题目描述:两个数组的交集
解题思路:
1.首先判断两个数组的长度谁大,根据较大值开辟一个数组result,用于存储相交时的结果,再定义一个变量k,用于记录结果数组中元素的个数。
2.然后遍历两个数组,定义一个变量flag初始化为0,当找到相等元素时,将nums2[j]的值置为-1,目的是避免重复匹配,同时将flag置为1,表示找到相同元素。
3.将nums[i]的元素添加到result数组中,并不断对k+1。最后返回result数组即可。
代码实现:
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {int len = nums1Size > nums2Size ? nums1Size : nums2Size;int* result = (int*)malloc(sizeof(int) * len);int k = 0;for(int i = 0;i<nums1Size;i++){int flag = 0;for(int j = 0;j<nums2Size;j++){if(nums1[i] == nums2[j]){flag = 1;nums2[j] = -1;}}if(flag == 1){result[k++] = nums1[i];}}*returnSize = k;return result;
}
今天的分享就到这里啦,如果感到不错,希望能给博主一键三连,感谢大家的支持!希望这篇文章可以帮到大家,我们下期再见!