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

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

相关推荐
roman_日积跬步-终至千里11 小时前
【Java并发】多线程/并发问题集
java·开发语言
皮皮哎哟11 小时前
深入浅出双向链表与Linux内核链表 附数组链表核心区别解析
c语言·数据结构·内核链表·双向链表·循环链表·数组和链表的区别
调皮连续波(rsp_tiaopige)11 小时前
毫米波雷达 : OpenRadar(Matlab版本)正式发布
开发语言·matlab
独断万古他化11 小时前
【算法通关】前缀和:从一维到二维、从和到积,核心思路与解题模板
算法·前缀和
loui robot11 小时前
规划与控制之局部路径规划算法local_planner
人工智能·算法·自动驾驶
格林威12 小时前
Baumer相机金属焊缝缺陷识别:提升焊接质量检测可靠性的 7 个关键技术,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·堡盟相机
冷雨夜中漫步12 小时前
python反转列表reverse()和[::-1]哪个效率更高
开发语言·python
rainbow688912 小时前
Python面向对象编程与异常处理实战
开发语言·python
你撅嘴真丑12 小时前
第八章 - 贪心法
开发语言·c++·算法
VT.馒头12 小时前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript