【C语言】初阶算法相关习题(二)


个人主页:夜晚中的人海

文章目录

⭐一、两数之和

题目描述:两数之和

解题思路:

1.先创建一个动态分配的数组ret,用于存储结果,其大小为numbersLen

2.使用一个外层循环遍历数组numbers,循环变量i从0到numbersLen - 1。如果当前值大于目标值,则跳过当前循环

3.对于每个i,使用一个内层循环从i + 1到numbersLen - 1,循环变量j用于查找与numbers[i]相加等于target的另一个数字

4.若sum等于目标值target,则找到了满足条件的两个数字。将下标i和下标j分别+1存储到ret数组中*(题目要求下标从1开始)

5.设置returnSize为2,表示返回数组的大小,最后返回目标数组ret。若遍历完数组都没找到满足条件的两个数字,则返回0

代码实现:

c 复制代码
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
    // write code here
    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.创建一个动态分配的数组ret,大小为2,用于存储完全匹配的数量(ret[0])和部分匹配的数量(ret[1])。初始值都设为0

2.使用一个循环遍历字符串solution和guess,若两者在某一位置时字符都相等,说明当前字符完全匹配,增加ret[0]的值。然后将该位置的值分别都修改成一个特殊的字符'0',表示这些字符已经被匹过,避免在后续计算部分匹配时重复计算。

3.再次遍历solution和guess,对于solution中的每个字符(未被修改为'0'的字符),检查guess中是否有相同的字符。如果找到匹配的字符,则增加ret[1]的值

4.然后将solution[i]和guess[j]都修改为'0',表示这些字符已经被匹配过,避免重复计算。

5.跳出循环后,说明部分匹配结束。返回ret数组即可

代码实现:

c 复制代码
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;
}

🎡三、寻找奇数

题目描述:寻找奇数

解题思路:根据异或运算符的性质(1.任何数字与自身异或的结果为0。2.任何数字与0异或的结果为自身。3.异或运算满足交换律和结合律 )因此,如果将数组中的所有数字依次进行异或运算,成对出现的数字会相互抵消,最终剩下的就是那个唯一不重复的数字。

代码实现:

c 复制代码
#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',这题过于简单,就不过多赘述了。

代码实现:

c 复制代码
//方法一:使用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; 
}
c 复制代码
//方法二:将下标n变为结束标志的方法
int main() {
    char str[1000];
    scanf("%s",str);
    int n = 0;
    scanf("%d",&n);
    str[n] = '\0';
    printf("%s\n",str);
    return 0;
}

🎉五、寻找峰值

题目描述:寻找峰值

解题思路:

1.处理边界情况:检查第一个元素,如果nums[0] > nums[1],则直接返回0,因为nums[0]是峰值;

检查最后一个元素,如果nums[numsLen-1] > nums[numsLen-2],则直接返回numsLen - 1,因为nums[numsLen-1]是峰值。

2.使用一个循环从0到numsLen,对于每个索引i,检查是否满足nums[i] > nums[i-1]且nums[i] > nums[i+1]。

3.如果找到满足条件的元素,则返回其索引i。

4.如果遍历完整个数组都没有找到峰值元素,则返回-1。

代码实现:

c 复制代码
int findPeakElement(int* nums, int numsLen ) {
    // write code here
    //找两端的峰值
    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;
}

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

相关推荐
香蕉可乐荷包蛋6 分钟前
Python面试问题
开发语言·python·面试
Vacant Seat11 分钟前
贪心算法-跳跃游戏II
算法·游戏·贪心算法
小柒的博客13 分钟前
联合体union的特殊之处
c语言·机器人
ErizJ16 分钟前
Golang|分布式索引架构
开发语言·分布式·后端·架构·golang
.生产的驴16 分钟前
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
java·开发语言·spring boot·后端·前端框架
夜松云20 分钟前
从对数变换到深度框架:逻辑回归与交叉熵的数学原理及PyTorch实战
pytorch·算法·逻辑回归·梯度下降·交叉熵·对数变换·sigmoid函数
八股文领域大手子24 分钟前
深入浅出限流算法(三):追求极致精确的滑动日志
开发语言·数据结构·算法·leetcode·mybatis·哈希算法
啊阿狸不会拉杆1 小时前
人工智能数学基础(一):人工智能与数学
人工智能·python·算法
一捌年1 小时前
java排序算法-计数排序
数据结构·算法·排序算法
几度泥的菜花1 小时前
优雅实现网页弹窗提示功能:JavaScript与CSS完美结合
开发语言·javascript·css