作者介绍:
作者:热爱编程不起眼的小人物
作者的Gitee:代码仓库
系列文章推荐:实现Strcpy函数 - 通过函数发现 “程序之美” | 不断优化、优化、再优化~
【第一章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
【第二章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
我和大家一样都是初次踏入这个美妙的“元”宇宙 希望在输出知识的同时,也能与大家共同进步、无限进步
文章目录
- 全网最火特辑 第三章 C语言之牛客网刷题笔记 【✨点进来保证让知识充实你一整天】
- 前言
- 选择题【全面深度剖析】
- 考点:函数的调用的理解和应用
- 考点:const对指针的理解和应用
- 考点:全局变量与转义字符的理解和应用
- 考点:运算符优先级和结合性的理解和应用
- 考点:循环判断条件的理解和应用
- 编程题【全面深度解析】
- ️【牛客网题号:HJ97 记负均正】【难度:简单】
- ️【牛客网题号:JZ11 旋转数组的最小数字】【难度:简单】
- 总结
同学们,新的学期早已开始啦~相信大家都想在这学期偷偷地卷”死“同学吧大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!✊
星光不负赶路人,时光不有心人 只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!
以下内容干货满满,跟上步伐吧~
1、已知函数的原型是: int fun(char b[10], int *a)
设定义: char c[10]; int d;
正确的调用语句是()
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
从而获得这个整型的地址,那函数便也可以拿整型指针接收
所以同学们只要分析好函数声明
的部分,便可以很好的完成本题~
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 解引用的值是保持不变的
2️⃣const如果在指针变量的 “ * ” 的右边【即 int * const a】
➡️ 表达的意思是: a里面存放的地址是保持不变
经过以上了解后,我们再看回题目:
*
的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量所以上题中的:
*c
和*d
不能变
*
的右侧,则 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
为假
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;
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];
}
综上,特辑的第三章呐~
让我们大家一同在平凡的生活中奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”
如果有错误❌,欢迎指正呀