C语言初级算法练习其二

C语言初级算法练习其二

在这里插入图片描述C语言初级算法练习其二

" />

个人主页:暗夜中的人群

在这里插入图片描述C语言初级算法练习其二

" />

文章目录

  • ⭐一、两数相加问题
  • 🏠二、策略猜测游戏
  • 🎡三、查找奇数元素
  • 🚀四、字符串截取操作
  • 🎉五、找寻峰值元素

⭐一、两数相加问题

题目描述:两数之和

在这里插入图片描述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;
}

🏠二、策略猜测游戏

题目描述:珠玑妙算

在这里插入图片描述C语言初级算法练习其二

" />

解题思路:
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;
}

🎡三、查找奇数元素

题目描述:寻找奇数

在这里插入图片描述C语言初级算法练习其二

" />

解题思路:利用异或运算符的特性:任何数与自身异或结果为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;
}

🚀四、字符串截取操作

题目描述:截取字符串

在这里插入图片描述C语言初级算法练习其二

" />

解题思路:有两种实现方式,一是使用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;
}

🎉五、找寻峰值元素

题目描述:寻找峰值

在这里插入图片描述C语言初级算法练习其二

" />

解题思路:
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;
}

今日分享到此结束啦,若觉得内容不错,期望能给博主来个一键三连,感激各位的支持!希望本篇文章能对大家有所助益,咱们下期再会!

版权声明:程序员胖胖胖虎阿 发表于 2025年7月5日 下午5:55。
转载请注明:

C语言初级算法练习其二

| 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...