【第六章】 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:
0B:
5C:
1D:
无限
👉同学们做这些题目的时候一定要耐心哦~
: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:
intB:
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:
360集团公司氛围 407人发布