【C语言】初阶算法相关习题(一)_c语言算法题
个人主页
文章目录
- ⭐一、数字在升序数组中出现的次数
- 🏠二、整数转换
- 🚀三、至少是其他数字两倍的最大数
- 🏝️四、字符个数的统计
- 🎄五、自除数
- 🎡六、除自身以外数组的乘积
- 🎉七、两个数组的交集
⭐一、数字在升序数组中出现的次数
题目描述:数字在升序数组中出现的次数
解题思路:由于数组是升序的,所以我们可以直接采用暴力的方法,遍历数组,统计数组中出现这个数字的次数即可解决。
代码实现:
int GetNumberOfK(int* nums, int numsLen, int k ) { // write code here int 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 #include 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;}
今天的分享就到这里啦,如果感到不错,希望能给博主一键三连,感谢大家的支持!希望这篇文章可以帮到大家,我们下期再见!