当前位置: 首页 > news >正文

【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;
}

今天的分享就到这里啦,如果感到不错,希望能给博主一键三连,感谢大家的支持!希望这篇文章可以帮到大家,我们下期再见!

相关文章:

  • Docker 部署 Redis 缓存服务
  • 安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型
  • 安宝特分享|AR智能装备赋能企业效率跃升
  • BEVDepth: Acquisition of Reliable Depth for Multi-View 3D Object Detection
  • leetcode 二分查找
  • 神经网络 “疑难杂症” 破解指南:梯度消失与爆炸全攻略(六)
  • 信奥赛CSP-J复赛集训(DP专题)(19):P3399 丝绸之路
  • Trent硬件工程师培训完整135讲
  • Windows 下 Git 入门指南:从安装、配置 SSH 到加速 GitHub 下载
  • gradle可用的下载地址(免费)
  • 研发效率破局之道阅读总结(3)工程优化
  • 【Lua】Lua 入门知识点总结
  • 使用 acme.sh 自动更新 SSL 证书的指南
  • 【MySQL】005.MySQL表的约束(上)
  • WPS Office安卓版云文档同步速度与PDF转换体验测评
  • 突破AI检测边界:对抗技术与学术伦理的终极博弈
  • Sharding-JDBC 系列专题 - 第五篇:分布式事务
  • 电脑安装adb并且连接华为手机mate60pro后查看设备
  • Spring Boot 主模块 spring-boot 核心技术解析:从启动类到内嵌容器的无缝支持
  • 三角形神经网络(TNN)
  • 对话地铁读书人|超市营业员朱先生:通勤时间自学心理学
  • 威廉·透纳诞辰250周年|他是现代艺术之父
  • 全球最大车展在上海启幕,解放日报头版头条:“看懂上海车展,就能预判未来”
  • 专访|前伊核谈判顾问:伊朗不信任美国,任何核协议都会有中俄参与
  • 讲武谈兵|英国公布六代机最新渲染图,但研发面临多重难题
  • 同比增长1.2倍!一季度货物贸易项下跨境资金净流入2063亿美元