【第六章】 C语言之牛客&力扣刷题笔记
前言
同学们,新的学期早已开始啦:kissing_closed_eyes:~相信大家都想在这学期偷偷地卷”死“同学吧:innocent:大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!:fist:
星光不负赶路人,时光不有心人 只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!
以下内容干货满满,跟上步伐吧~
🎒选择题【全面深度剖析】
📗 考点:break与continue在语句中的理解和应用
1、 以下叙述中正确的是( )
A: 只能在
循环体内
和switch
语句体内使用break
语句B: 当
break
出现在循环体中的switch
语句体内时,其作用是跳出该switch
语句体,并中止循环体的执行- C:
continue
语句的作用是:在执行完本次循环体中剩余语句后,中止循环
- C:
D: 在
while
语句和do-while
语句中无法使用continue
语句
:see_no_evil:大家觉得答案是什么呢
:hear_no_evil:答案是 A 啦~
:speak_no_evil: 如果有疑惑,且听我细细分析呀
本题的主要考点:"break与continue在语句中的理解和应用"
💡本题的解题关键:
- 理解
break
与continue
在语句中的理解和应用
➡️让我们来一个一个分析吧:
🟡
break
语句通常用在循环
语句和switch
语句中1️⃣当
break
语句应用于switch
语句中的时候,可使程序跳出switch,而执行switch以后的语句2️⃣当break语句用于
do-while
、for
、while
循环语句中时,可使程序终止循环,而执行循环后面的语句
- 🟠
continue
语句的作用是跳过循环体中剩余的语句而强行执行下一次循环
👉综上:
break语句若在
循环
orswitch
语句中,则遇到break时,跳出上述语句,执行后续程序【中止循环 or 跳出switch语句】continue语句若在循环语句中时,则仅仅
跳过本次
循环,执行下次的循环【不会中止循环】✨所以这也是为什么会选
A
啦~
📕考点:逻辑操作符的理解的和应用
2、 下列for
循环的次数为( )
for(int i = 0 ; i || i++ < 5; );
A:
0
B:
5
C:
1
D:
无限
👉同学们做这些题目的时候一定要耐心哦~
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 D 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“逻辑操作符的理解的和应用”
💡本题的解题关键:
- 理解
||
(逻辑或)操作符的应用
➡️简单来说:
1️⃣
逻辑或
操作符意思可理解为或者
,多用于判断条件中,即把各个运算的变量(或常量)连接起来组成一个逻辑表达式2️⃣即当多个条件中有任一个条件满足,
逻辑或
的运算结果就为真
3️⃣只有条件全为
假
的时候,逻辑或
的运算结果才为假
❗特别注意:
- 当
逻辑或
表达式中的条件为算式
的时候,遵循着从左到右
判断条件:==逻辑或运算如果前表达式为真
,后表达式不计算==
👉回到题目:
1️⃣第一次循环时
i = 0
,对于i || i++ < 5
来说:前表达式(i)为
假
,继而判断后表达式(i++ < 5)先执行
i++
,i
此时为1
,后表达式判断为真
,所以才会进入到循环中,执行第一次循环
2️⃣第二次循环时
i = 1
,对于i || i++ < 5
来说:- 前表达式(i)为
非0
,即为真
;则不需要再判断后表达式,即后表达式不计算,即不再执行i++
,也就是死循环
- 前表达式(i)为
✨这也就是为什么选D
啦~
📘考点:do-while循环的理解和应用
3、 以下描述中正确的是( )
A:
由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句
B:
do-while循环由do开始,用while结束,在while(表达式)后面不能写分号
C:
在do-while循环体中,不一定要有能使while后面表达式的值变为零("假")的操作
D:
do-while循环中,根据情况可以省略while
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 C 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“do-while循环的理解和应用”
💡解题关键:
- 理解好
do - while
循环语句
➡️我们来一个一个分析吧~
❤️do-while循环中的循环体通常都是复合语句代码块,所以
A
错误🧡while(表达式)后面要写分号,所以
B
错误💛
√
💚while不能省略,所以
D
错误
✨这也就是这题为什么选D
啦~
📙考点:函数传参的理解和应用
4、 设函数 fun
和实参数组的说明是如下形式,则对函数的调用语句中,正确的是( )
void fun(char ch,float x[]); float a[10];
A:
fun("asd" , a[]);
B:
fun('x' , A);
C:
fun('68' , 2.8);
D:
fun(32 , a);
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 D 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“函数传参的理解和应用”
💡解题关键:
- 只需要对应着函数声明中的函数参数类型进行传参函数、调用即可
❗我们可观察到:
1️⃣函数的第一个参数为:
字符类型
2️⃣函数的第二个参数为:
float x[]
来接收参数但这样不便于我们理解,可以转换为
float *(x)
所以这里需要我们传
浮点型数组
或者float*
指针(地址)即可
➡️ 让我们一起来解题吧~
🔴
A
选项中数组传参只需要写数组名就行【数组名为数组首元素地址】,a[]
是错误的🟠
B
选项第二个参数写成了大写,错了🟡
C
选项第二个参数是浮点数,与fun函数的第二参数是数组不匹配,所以错了
✨综上: 这也是为什么选D
啦~
📓考点:默认返回的类型的理解和应用
5、 在c语言中,一个函数不写返回值类型,默认的返回类型是 ( )
A:
int
B:
char
- C:
void
- D:
都不是
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 A 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“默认返回类型的理解和应用”
💡解题关键:
- 一个函数不写返回值类型,默认的返回类型是
int
❗特别注意:
- 我们不提倡这么做哦~
✨综上: 这也为什么选A
啦~
📖编程题【全面深度解析】
🏷️【leetcode 题号:747. 至少是其他数字两倍的最大数】【难度:简单】
1、 给你一个整数数组 nums
,其中总是存在唯一的
一个最大整数
请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍
如果
是
,则返回最大元素的下标
如果
不是
,则返回-1
:mag:题目传送门:OJ链接
示例: 输入:nums = [3,6,1,0] 输出: 1
解释: 6 是最大的整数,对于数组中的其他整数,6 至少是数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。
💡解题关键:
➡️思路一: 暴力破解法
法一: 双重循环遍历数组,对每个元素判断是否是其他元素的两倍【相对复杂】
法二: 先遍历一遍找出最大值,然后遍历一遍判断是否是其他数字二倍【相对简单】
👉实现:
- 法二:
int dominantIndex(int* nums, int numsSize) { int max = 0; max = nums[0]; int flag = 0; for(int i = 0;i < numsSize; i++) { if(max < nums[i]) { max = nums[i]; flag = i; //记录下标 } } for(int i = 0;i < numsSize; i++) { if(i != flag && max >= 2*nums[i]) { ; } else if(i != flag) { return -1; } } return flag; }
❗但此时这道题目我们还可以再优化
➡️思路二:
- 一次遍历找出
最大的数字
和次大的数字
,判断最大的数字是否是次大数字2倍即可
👉实现:
int dominantIndex(int* nums, int numsSize) { int fMax = -1; int sMax = -1; int flag = -1; for (int i = 0; i < numsSize; i++) { if (nums[i] > fMax) { sMax = fMax; fMax = nums[i]; flag = i; } else if (nums[i] > sMax) { sMax = nums[i]; } } return fMax >= sMax * 2 ? flag : -1; }
🏷️【 leetcode 题号:349. 两个数组的交集】【难度:简单】
2、 给定两个数组,编写一个函数来计算它们的交集。
- 输出结果中的每个元素一定是
唯一
的。我们可以不考虑输出结果的顺序
:mag:题目传送门:OJ链接
示例: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4]
💡解题关键:
1️⃣将
nums1
数组中的每一个数字,判断是否存在于nums2
数组中2️⃣期间将交集的数字存在一个自己创建的返回数组中
3️⃣期间再判断交集的数字是否已经在返回的数组中
如果
在
,则不存
如果
不在
,则存起来
👉实现:
static int arr[1000] = {0}; int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) { int i = 0; int j = 0; int k = 0; int size = 0 ; for(i = 0;i < nums1Size; i++) { for(j = 0;j < nums2Size; j++) { if(nums1[i] == nums2[j]) { int element = nums1[i]; int flag = 0; //标识符: //判断交集元素是否已经存储于返回数组中 for(k = 0;k < size; k++) { //遍历返回数组,查看是都已经存储 if(arr[k] == element) { flag = 1; break; } } //没有存储于返回数组,则存储 if(flag == 0) { arr[size] = element; size++; } } } } *returnSize = size; return arr; }
# ✨总结 综上,特辑的第六章呐:lollipop:~
让我们大家一同在平凡的生活中奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”
:dizzy:如果有错误❌,欢迎指正呀:dizzy:
:sparkles:如果觉得收获满满,可以点点赞👍支持一下哟~:sparkles: