C语言初级算法练习其二


文章目录
- ⭐一、两数相加问题
- 🏠二、策略猜测游戏
- 🎡三、查找奇数元素
- 🚀四、字符串截取操作
- 🎉五、找寻峰值元素
⭐一、两数相加问题
题目描述:两数之和

解题思路:
1.首先创建一个动态分配的数组用于存储结果,其大小根据输入数组长度确定。
2.通过外层循环遍历数组中的每个元素,若当前元素大于目标值则跳过。
3.对于每个外层循环确定的元素,通过内层循环从当前元素的下一个位置开始寻找,使得两者之和等于目标值的另一个元素。
4.一旦找到满足条件的两个元素,将它们的下标分别加1后存储到结果数组中,并设置返回数组的大小为2后返回该结果数组。若遍历完数组都未找到符合条件的元素,则返回0。
代码实现:
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// 编写代码的位置
int* ret = (int*)malloc(sizeof(int) * numbersLen);
for(int i = 0; i < numbersLen; i++) {
if(numbers[i] > target) {
continue;
}
for(int j = i + 1; j < numbersLen; j++) {
int sum = numbers[i] + numbers[j];
if(sum == target) {
ret[0] = i + 1;
ret[1] = j + 1;
*returnSize = 2;
return ret;
}
}
}
return 0;
}
🏠二、策略猜测游戏
题目描述:珠玑妙算

解题思路:
1.创建一个大小为2的动态分配数组来存储完全匹配数量和部分匹配数量,初始值均设为0。
2.遍历两个字符串,若同一位置的字符完全相同,则完全匹配数量加1,并将该位置的字符修改为特殊字符‘0’以避免后续重复计算。
3.再次遍历两个字符串,对于未被修改为‘0’的字符,检查另一个字符串中是否存在相同字符,若存在则部分匹配数量加1,并同样将对应字符修改为‘0’。
4.最终返回存储完全匹配和部分匹配数量的数组。
代码实现:
int* masterMind(char* solution, char* guess, int* returnSize) {
int* ret = (int*)malloc(sizeof(int) * 2);
ret[0] = 0;
ret[1] = 0;
int len = strlen(solution);
for(int i = 0; i < len; i++) {
// 完全匹配的情况
if(solution[i] == guess[i]) {
ret[0]++;
solution[i] = guess[i] = '0';
}
}
for(int i = 0; i < len; i++) {
for(int j = 0; j < len; j++) {
if(solution[i] == guess[j] && solution[i] != '0') {
ret[1]++;
solution[i] = guess[j] = '0';
*returnSize = 2;
}
}
}
return ret;
}
🎡三、查找奇数元素
题目描述:寻找奇数

解题思路:利用异或运算符的特性:任何数与自身异或结果为0,任何数与0异或结果为自身,且异或满足交换律和结合律。将数组中所有元素依次异或,成对出现的元素会相互抵消,最终剩余的就是唯一的奇数元素。
代码实现:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int ret = 0;
int m = 0;
for(int i = 0; i < n; i++) {
scanf("%d", &m);
ret ^= m;
}
printf("%d\n", ret);
return 0;
}
🚀四、字符串截取操作
题目描述:截取字符串

解题思路:有两种实现方式,一是使用strncpy
函数直接复制指定长度的字符串内容;二是通过将指定截断位置的字符设置为字符串结束标志‘\0’来实现截断。
代码实现:
方法一:使用strncpy函数实现
int main() {
char str[100];
scanf("%s", str);
int n;
scanf("%d", &n);
char ret[100];
strncpy(ret, str, n);
ret[n] = '\0';
printf("%s\n", ret);
return 0;
}
方法二:通过设置结束标志实现
int main() {
char str[1000];
scanf("%s", str);
int n = 0;
scanf("%d", &n);
str[n] = '\0';
printf("%s\n", str);
return 0;
}
🎉五、找寻峰值元素
题目描述:寻找峰值

解题思路:
1.处理边界情况:若第一个元素大于第二个元素,则第一个元素是峰值;若最后一个元素大于倒数第二个元素,则最后一个元素是峰值。
2.通过循环遍历数组,检查每个元素是否同时大于其前后元素,若满足则返回该元素的索引。
3.若遍历完数组未找到峰值元素,则返回-1。
代码实现:
int findPeakElement(int* nums, int numsLen ) {
// 编写代码的位置
// 检查两端的峰值情况
if(nums[0] > nums[1]) {
return 0;
}
if(nums[numsLen - 1] > nums[numsLen - 2]) {
return numsLen - 1;
}
for(int i = 0; i < numsLen; i++) {
if(nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) {
return i;
}
}
// 未找到峰值的情况
return -1;
}
今日分享到此结束啦,若觉得内容不错,期望能给博主来个一键三连,感激各位的支持!希望本篇文章能对大家有所助益,咱们下期再会!