> 文档中心 > 【第三章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】

【第三章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】


💕全网最火特辑💕 第三章 C语言之牛客网刷题📖笔记 【✨点进来保证让知识充实你一整天】

在这里插入图片描述


作者介绍:

🎓作者:热爱编程不起眼的小人物🐐
🔎作者的Gitee:代码仓库
📌系列文章推荐:实现Strcpy函数 - 通过函数发现 “程序之美” | 不断优化、优化、再优化~
【第一章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
【第二章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
📒我和大家一样都是初次踏入这个美妙的“元”宇宙🌏 希望在输出知识的同时,也能与大家共同进步、无限进步🌟


文章目录

  • 💕全网最火特辑💕 第三章 C语言之牛客网刷题📖笔记 【✨点进来保证让知识充实你一整天】
  • 前言
  • 🎒选择题【全面深度剖析】
    • 📗 考点:函数的调用的理解和应用
    • 📕考点:const对指针的理解和应用
    • 📘考点:全局变量与转义字符的理解和应用
    • 📙考点:运算符优先级和结合性的理解和应用
    • 📓考点:循环判断条件的理解和应用
  • 📖编程题【全面深度解析】
    • 🏷️【牛客网题号:HJ97 记负均正】【难度:简单】
    • 🏷️【牛客网题号:JZ11 旋转数组的最小数字】【难度:简单】
  • 总结

前言

同学们,新的学期早已开始啦😚~相信大家都想在这学期偷偷地卷”死“同学吧😇大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!✊

星光不负赶路人,时光不有心人

只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!

以下内容干货满满,跟上步伐吧~


🎒选择题【全面深度剖析】

📗 考点:函数的调用的理解和应用

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 啦~

🙊 如果有疑惑,且听我细细分析呀

本题的主要考点:"函数的调用"

本题的解题关键:

  • 清楚的明白如何给函数传参函数的调用

题干已给出函数的声明,此声明已给出此函数的所需的两个条件:

  1. 函数的返回类型:int
  2. 函数有两个参数:字符数组的地址;整形地址

特别注意:

  • 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 就是修饰指针本身,即指针本身是常量

所以上题中的: ef的地址不能被改变

综上:A选项想改变*c的值就错了,B选项同理;ef的地址不能被改变,所以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];}

总结

综上,特辑的第三章呐🍭~

让我们大家一同在平凡的生活中奔赴热爱吧~

毕竟,

“热爱的东西 永远不要说放弃”

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨
在这里插入图片描述