【第三章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
💕全网最火特辑💕 第三章 C语言之牛客网刷题📖笔记 【✨点进来保证让知识充实你一整天】
作者介绍:
🎓作者:热爱编程不起眼的小人物🐐
🔎作者的Gitee:代码仓库
📌系列文章推荐:实现Strcpy函数 - 通过函数发现 “程序之美” | 不断优化、优化、再优化~
【第一章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
【第二章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
📒我和大家一样都是初次踏入这个美妙的“元”宇宙🌏 希望在输出知识的同时,也能与大家共同进步、无限进步🌟
文章目录
前言
同学们,新的学期早已开始啦😚~相信大家都想在这学期偷偷地卷”死“同学吧😇大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!✊
星光不负赶路人,时光不有心人
只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!
以下内容干货满满,跟上步伐吧~
🎒选择题【全面深度剖析】
📗 考点:函数的调用的理解和应用
1、已知函数的原型是: int fun(char b[10], int *a)
设定义: char c[10]; int d;
正确的调用语句是()
- A:
fun(c,&d);
B:fun(c,d);
C:fun(&c,&d);
D:fun(&c,d);
🙈大家觉得答案是什么呢
🙉答案是 A 啦~
🙊 如果有疑惑,且听我细细分析呀
本题的主要考点:"函数的调用"
本题的解题关键:
- 清楚的明白如何给函数传参与函数的调用
即
题干
已给出函数的声明,此声明已给出此函数的所需的两个条件:
- 函数的返回类型:
int
- 函数有两个参数:
Ⅰ
字符数组的地址;Ⅱ
整形地址
特别注意:
char b[10]
本质上接收的是字符地址
- 之所以拿
int *a
接受,是因为形参传递的是一个整型地址
有了以上了解后,题目便迎刃而解啦~
char c[10]
的数组名c就代表着字符数组的首元素地址,即字符指针
,所以可以直接传数组名给函数
int d
便可以&d
从而获得这个整型的地址,那函数便也可以拿整型指针接收
所以同学们只要分析好函数声明
的部分,便可以很好的完成本题~
📕考点:const对指针的理解和应用
2、请问下列表达式哪些会被编译器禁止【多选】()
int a = 248, b = 4;int const *c = 21;const int *d = &a;int *const e = &b;int const * const f = &a;
A: *c = 32;
B:*d = 43
C:e=&a
D:f=0x321f
同学们做这道题可十分经典哦❗
- 这题目可曾经在
华为面试题
中出现过
🙈同学们觉得答案是什么呢
🙉答案是 ABCD 啦~
🙊 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“const对指针的理解和应用”
在解题前,让我们先了解了解const对指针的作用是什么❓
1️⃣const如果在指针变量的 *
的左边【即 const int * a == int const * a】:
➡️表达的意思是: 对指针变量a 解引用的值是保持不变的
- 只有a里面存放的地址改变了,解引用出来的值才会变化
2️⃣const如果在指针变量的 “ * ” 的右边【即 int * const a】
➡️ 表达的意思是: a里面存放的地址是保持不变
- 只有主动对 *a 赋值才能改变这个值,但a里面的地址是一直保持不变的
经过以上了解后,我们再看回题目:
- 如果 const 位于
*
的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量
所以上题中的:
*c
和*d
不能变
- 如果 const 位于
*
的右侧,则 const 就是修饰指针本身,即指针本身是常量
所以上题中的:
e
和f
的地址不能被改变
综上:A
选项想改变*c
的值就错了,B
选项同理;e
和f
的地址不能被改变,所以C
选项和D
选项都错啦~
这类题型是不是很可爱呢😚~
💡不太理解的同学可以反复理解,这类题型值得我们这么做👈
📘考点:全局变量与转义字符的理解和应用
3、以下程序的输出结果为( )
#include int i;void prt(){for (i = 5; i < 8; i++)printf("%c", '*');printf("\t");} int main(){for (i = 5; i <= 8; i++)prt();return 0;}
A: ***
B: *** *** *** ***
C: *** ***
D: * * *
🙈同学们觉得答案是什么呢
🙉答案是 A 啦~
🙊 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“全局变量与转义符的理解和应用”
特别注意:
- 这题出现了
\t
转义字符 - 且创建了一个
全局变量
👉\t
为水平制表符,简单来说就是在键盘上按了TAB
的效果,也可以理解为缩进符
👉全局变量
创建在静态区中,作用域为整个程序且生命周期与主函数相同,只有程序结束,它才会销毁
本题我们只需要稍加画图理解便可得出答案:
📙考点:运算符优先级和结合性的理解和应用
4、下面代码段的输出是( )
int main(){int a=3;printf("%d\n",(a+=a-=a*a));return 0;}
A: -6
B:12
C:0
D:-12
🙈同学们觉得答案是什么呢
🙉答案是 B 啦~
🙊 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“`运算符优先级和结合性的理解和应用”
特别注意:本题考查的是运算符的优先级和结合性
💡不难发现:
- 它们的求值的优先顺序是相同的,而结合性都是
从右向左
➡️我们便可得:a+=a-=a*a
得计算可分为两步:
1️⃣a-=a*a
= a = a - (a*a)
= -6
2️⃣a+=a
= a = a + a
= -6 + (-6)
= -12
✨所以答案为:B
📓考点:循环判断条件的理解和应用
5、下列不能实现死循环的是( )
A: while(1){ }
B:for(;1;){ }
C:do{}while(1);
D:for(;0;){ }
🙈同学们觉得答案是什么呢
🙉答案是 D 啦~
🙊 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“循环判断条件的理解和应用”
注意:
- 只有条件为
真
时才进行循环
💡即:非0
为真(包括正负数)、有0
为假
综上:A、B、C选项中循环判断条件为1
为真
,D选项中循环判断条件0
为假
📖编程题【全面深度解析】
🏷️【牛客网题号:HJ97 记负均正】【难度:简单】
1、首先输入要输入的整数个数 n
,然后输入n
个整数。输出为 n
个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
-
输入描述:首先输入一个正整数
n
,然后输入n
个整数 -
输出描述:输出负数的个数,和所有正整数的平均值
🔍题目传送门:OJ链接
示例:输入: 5 1 2 3 4 5 10 1 2 3 4 5 6 7 8 9 0输出:0 3.0 0 5.0
💡解题关键:
-
这道题其实通过
scanf
捕捉数据即可,统计负数个数,以及正数格式,并且在统计正数个数的过程中求取正数总和,最后计算得出平均数即可 -
需要注意的是所有数字中0是不统计在内的
👉实现:
#include int main(){ int n = 0; while(scanf("%d",&n) != EOF) { int arr[2000] = {0}; int i = 0; int count = 0; double val = 0; int sum = 0; int b = 0; for(i=0;i<n;i++) { scanf("%d",&arr[i]); if(arr[i] > 0) { sum = sum + arr[i]; b++; } if(arr[i]<0) { count++; } } val = sum/(b*1.0); printf("%d %.1lf\n",count,val); }return 0;
🏷️【牛客网题号:JZ11 旋转数组的最小数字】【难度:简单】
2、有一个长度为 n
的非降序数组,比如[1,2,3,4,5]
,将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2]
,或者[4,5,1,2,3]
这样的。请问,给定这样一个旋转数组,求数组中的最小值
- 数据范围:
1≤ n ≤ 10000
- 数组中任意元素的值:
0 ≤ val ≤ 10000
🔍题目传送门:OJ链接
示例:输入:[3,4,5,1,2]返回值:1
💡解题关键:
- 暴力破解:
遍历数组
找出最小值即可
👉实现:
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) { int min = *rotateArray; int i = 0; for(i=0;i<rotateArrayLen-1;i++) { rotateArray = rotateArray + 1; if(min > *rotateArray) { min = *rotateArray; } } return min;}
✨这题还有更优解
- 采用
二分查找
的思想
❗二分查找算法不限于运用在有序数组上。如果能够明确二分之后,答案存在于二分的某一侧,就可以使用二分❗
📖:这个题主要分析三种旋转情况 [1, 2, 3, 4, 5],使用中间值与右端进行比较
- 之所以选择右端点来比较,是因为
原始数组是非递减
(即一开始数据大的总是在右端),若中间>右边
,则恒有左端点至中间>=右端点
1️⃣[3, 4, 5, 1, 2] 中间大于右端:恒有左端点至中间>=右端点
,则确定答案为 [mid+1...last]区间
2️⃣[5 1 2 3 4] 中间小于右端:说明答案肯定不在[mid+1…last],但是arr[mid] 有可能是答案,所以答案在[first, mid]
区间
3️⃣[1 0 1 1 1] 中间等于右端:这时候需要缩小范围 right–;注意不能是left++,因为是非降序数组,所以要缩小右边范围,把较小值向右推,符合我们的判断规则
👉实现:
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {if (rotateArrayLen == 0) return 0;int left = 0, right = rotateArrayLen - 1, mid;if (rotateArray[right] > rotateArray[left]) return rotateArray[0];while(left < right) {mid = left + (right - left) / 2;if (rotateArray[mid] > rotateArray[right]) left=mid+1;else if (rotateArray[mid] == rotateArray[right]) right--;else right = mid;} return rotateArray[left];}
总结
综上,特辑的第三章呐🍭~
让我们大家一同在平凡的生活中奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨