C语言之练习题

embedded/2024/10/22 4:35:42/

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !😊


目录

  • 内容
    • 第一题:加一
    • 第二题:移动零
    • 第三题 :分发饼干
    • 第四题:买股票的最佳时机
    • 第五题:丢失的数字
  • 总结

内容

再会

第一题:加一

地址:oj地址

在这里插入图片描述

解题思路:暴力求解
这道题就像是整形数字的十进一,因为是个数组,只要不是首位需要进位,其内存空间不需要改变,并且给最后位的元素+1
可分为以下几种情况:
1.个位需要进位:{1,2,9}+1={1,3,0};
2.除去首位的其他位的进位:{1,9,9}+1={2,0,0};
3.首位进位:{9,9,9}+1={1,0,0,0} (这种情况比较特殊,需要开辟一块原来空间+1的空间,并且所有元素赋值为0,最后首元素赋值1)

int* plusOne(int* digits, int digitsSize, int* returnSize) {//从个位开始遍历for (int i = digitsSize - 1; i >= 0; i--){//从个位+1,判断是否需要进位digits[i] = digits[i] + 1;//如果个位+1后不为10,则可以直接返回数组if (digits[i] != 10){*returnSize = digitsSize;return digits;}elsedigits[i] = 0;//若为10,则可以把改为0}//开辟一块比原来空间+1的空间,题目要求必须malloc函数开辟,int* pa = (int*)malloc(sizeof(int) * (digitsSize + 1));//而malloc函数开辟的空间不会进行初始化,需要将空间所有元素赋值为0;memset(pa, 0, sizeof(int) * (digitsSize + 1));pa[0] = 1;//既然首元素做高位进位,则直接赋值最高位为1即可;*returnSize = digitsSize + 1;return pa;
}

对这题其实判断元素是否为9,还是给元素+1后判断是否为10;这两种的思路解决方式是一样的,所以这里就不多嘴了,大家可以试一试另一种;

第二题:移动零


地址:oj地址


在这里插入图片描述

解题思路:
思路1:暴力求解遍历一遍数组,遇到0就将0后面的元素一个一个往前覆盖,并且记录下0的个数x个,等所有元素遍历完,就将0从数组从后往前补x个;
思路2:双指针法创建两个指针 j i,分别用于跟踪非零元素的位置和当前遍历到的位置,起始位置均为 0。j负责找非0的数值,i负责找0,在进行交换数值;

暴力求解

void moveZeroes(int* nums, int numsSize) {// 计算数组中0的个数int count = 0;int i = 0;int j = 0;//即在整个数组中遍历while (j < numsSize) {//计算需要补零的个数if (nums[j] == 0) {count++;} else {//遍历将不为0的数放置数组前方nums[i] = nums[j];i++;}j++;}//在后面补零while (count--) {nums[j - 1] = 0;j--;}
}

双指针法

void moveZeroes(int* nums, int numsSize) {int i=0,j=0;//开始遍历while(j<numsSize){//当j位置不为0时,进行交换if(nums[j]){int tem=nums[i];nums[i]=nums[j];nums[j]=tem;i++;}//当j位置为0时,继续往前走,直到找到0j++;}
}

第三题 :分发饼干


地址:oj地址


在这里插入图片描述

思路一:排序法::将两个数组g s进行由大到小排序,这样最大胃口的小孩,和最大尺寸的饼干都在数组开始了,这样能够更好的遍历,再创建一个记录满足小孩的个数count,在分别遍历两个数组,找到:s 数组饼干尺寸能满足 g数组的小孩胃口的饼干,若能满足,应该进行判断:不能跳出了饼干数组,则count ++,最后等饼干数组遍历完或者小孩数组遍历完,返回count

动画演示
-在这里插入图片描述

排序法实现

int cmp(int* a, int* b) {return *a - *b;
}int findContentChildren(int* g, int gSize, int* s, int sSize) {//进行排序qsort(g, gSize, sizeof(int), cmp);qsort(s, sSize, sizeof(int), cmp);int m = gSize, n = sSize;//记录满足小孩的个数int count = 0;//进入遍历for (int i = 0, j = 0; i < m && j < n; i++, j++) {//找到能够满足最大胃口小孩的饼干while (j < n && g[i] > s[j]) {j++;}//找到后,要判断,下标不能超过数组;if (j < n) {count++;//找到了能匹配的饼干和小孩,在往后去寻找,直到某个数组遍历完}}return count;
}

第四题:买股票的最佳时机


地址:oj地址


在这里插入图片描述

第一种思路:暴力求解法::我们需要记录最小价格值,并且遍历后面的数值的价格 减去最小价格=利润,遍历完后最后的利润就是最大利润;
在这里插入图片描述

int maxProfit(int* prices, int pricesSize) {int min = prices[0];//假设这就是最小价格数值int max = 0;//开始时设最大利润值为0for (int i = 0; i < pricesSize; i++) {//遍历找那个最小的价格值if (min > prices[i])min = prices[i];//找出最大的利润值if (prices[i] - min > max)max = prices[i] - min;}//返回最大利润值return max;
}

第二种思路:暴力双层循环法:::我们需要找出给定数组中两个数字之间的最大差值(即,最大利润)。此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)。


注意:这种方法在力扣上运行会超时

int maxProfit(int* prices, int pricesSize)
{int max = 0;for (int i = 0; i < pricesSize-1; i++){for (int j = i + 1; j < pricesSize; j++){int ret = prices[j] - prices[i];//记录每次的利润,找出最大的利润if (ret > max){max = ret;}}}return max;
}

第五题:丢失的数字


地址:oj地址


在这里插入图片描述

思路
暴力遍历法:0~n之间的数加起来在遍历减去nums数组的值,即可;
位运算法根据出现的次数的奇偶性,可以使用按位异或运算得到丢失的数字:如有个数组[1,0,2,0,1]在这个数组中有些数组是成双出现的,根据 ^按位异或运算:且对任意整数x 都满足:x^x=0,x^0=0,可以将成双的数值互相消除,最后留下单身的那个;所以根据这个思路,可以将nums0~n都看成数组,这两个数组进行按位异或操作,就可以得出最后的那个值;

暴力遍历法:

int missingNumber(int* nums, int numsSize) {int sum=0;for(int i=0;i<=numsSize;i++){sum+=i;}for(int i=0;i<numsSize;i++){sum-=nums[i];}return sum;
}

对上代码可以这样优化:数学法:
int missingNumber(int* nums, int numsSize) {
int n=numsSize;
int total=n*(n+1)/2; //这里运用的数学的前n项求和
for(int i=0;i<numsSize;i++)
{
total-=nums[i];
}
return total;
}

对于上述代码我觉得可以写成这样:思路是和暴力一样的就是合并到了一个数组进行操作;
int missingNumber(int* nums, int numsSize) {
int sum=0;
for(int i=0;i<numsSize;i++)//这里判断条件 不能等于 否则会越界
{
sum+=(i-nums[i]);
}
return sum+numsSize; //
}

位运算法

int missingNumber(int* nums, int numsSize) {int sum=0;for(int i=0;i<numsSize;i++)//这里判断条件 不能等于 否则会越界{sum^=nums[i];sum^=i;}sum^=numsSize;return sum;
}

请添加图片描述


总结


到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的


http://www.ppmy.cn/embedded/129465.html

相关文章

leetcode hot100 之【LeetCode 2. 两数相加】 java实现

LeetCode 2. 两数相加 题目描述 给你两个非空的链表&#xff0c;表示两个非负整数。它们每位数字都是按逆序的方式存储的&#xff0c;也就是最左边的数字是最低位的数字。请你将这两个数相加&#xff0c;并以相同逆序的方式返回一个新的链表。你可以假设除了数字 0 之外&…

[单master节点k8s部署]39.安装mysql

通过下面的命令安装mysql。首先下载mysql的rpm包。mysql-community-release-el7-5.noarch.rpm 这个包的作用是将 MySQL 的官方 YUM 仓库添加到系统中&#xff0c;随后通过yum install来安装mysql。 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm …

连锁收银系统

商淘云连锁管理系统助力连锁企业实现“人货账”全方位数字化管理&#xff0c;它依托连锁品牌进销存管理实现门店订货、线下收银、线上商城、会员营销等一体化管理。 门店订货补货支持连锁直营、加盟 不同门店不同进货价、不同门店不同商品、不同门店在线或者账期支付、门店PC或…

Axios 的基本使用与 Fetch 的比较、在 Vue 项目中使用 Axios 的最佳实践

文章目录 1. 引言2. Axios 的基本使用2.1 安装 Axios2.2 发起 GET 请求2.3 发起 POST 请求2.4 请求拦截器2.5 设置全局配置 3. Axios 与 Fetch 的比较3.1 Axios 与 Fetch 的异同点3.2 Fetch 的基本使用3.3 使用 Fetch 处理 POST 请求 4. 讨论在 Vue 项目中使用 Axios 的最佳实践…

docker 和 containerd 关系

containerd 是一个开源的容器运行时&#xff0c;它是用来管理容器生命周期的守护进程。containerd 支持 Docker 和其他容器格式&#xff0c;并且是许多现代容器编排系统&#xff08;如 Kubernetes&#xff09;的基础组件之一。 containerd 提供了一个命令行工具 ctr&#xff0…

MyBatis 动态 SQL 详解

1. 什么是动态 SQL&#xff1f; 在使用 MyBatis 进行数据库查询时&#xff0c;可能会遇到一些需要根据条件动态生成 SQL 语句的情况。MyBatis 提供了强大的动态 SQL 支持&#xff0c;通过标签和条件语句&#xff0c;可以让 SQL 语句根据不同的输入参数动态生成。这大大提高了代…

通过OpenCV实现 Lucas-Kanade 算法

目录 简介 Lucas-Kanade 光流算法 实现步骤 1. 导入所需库 2. 视频捕捉与初始化 3. 设置特征点参数 4. 创建掩模 5. 光流估计循环 6. 释放资源 结论 简介 在计算机视觉领域&#xff0c;光流估计是一种追踪物体运动的技术。它通过比较连续帧之间的像素强度变化来估计图…

Python数据分析工具OpenCV用法示例

Python数据分析工具OpenCV是一个强大的计算机视觉库&#xff0c;提供了丰富的图像处理算法和功能&#xff0c;支持多种编程语言&#xff0c;包括Python、C、C#等。以下是OpenCV在Python中的一些常见用法示例&#xff1a; 一、图像读取、显示与保存 读取图像 import cv2 im…