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

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


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

在这里插入图片描述


作者介绍:

🎓作者: 热爱编程不起眼的小人物🐐
🔎作者的Gitee:代码仓库
📌系列文章推荐:

1.【第一章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
2.【第二章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
3.【第三章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
4.【第四章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
5.【第五章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
6.【第六章】 C语言之牛客&力扣刷题笔记 【点进来保证让知识充实你一整天】
7. 第七章】 C语言之牛客网&力扣刷题笔记 【点进来保证让知识充实你一整天】
📒我和大家一样都是初次踏入这个美妙的“元”宇宙🌏 希望在输出知识的同时,也能与大家共同进步、无限进步🌟


文章目录

  • 💕全网最火特辑💕 第八章 C语言之牛客网刷题📖笔记 【✨点进来保证让知识充实你一整天】
  • 前言
  • 🎒选择题【全面深度剖析】
    • 📗 考点字符串结束标记的理解和应用
    • 📕考点:数组引用操作符的理解的和应用
    • 📘考点:字符数组初始化的理解和应用
    • 📙考点:变长数组的理解和应用
    • 📓考点:二维数组解引用的理解和应用
  • 📖编程题【全面深度解析】
    • 🏷️【牛客网题号: HJ10 字符个数统计】【难度:简单】
    • 🏷️【leetcode 题号:169. 多数元素】【难度:简单】
  • ✨总结

前言

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

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

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

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


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

📗 考点:字符串结束标记的理解和应用

1、 如下程序的运行结果是( )

char c[5]={'a', 'b', '\0', 'c', '\0'};printf("%s", c);
  • A:‘a’ ‘b’

  • B:ab \0 c \0

  • C:ab c

  • D: ab

🙈大家觉得答案是什么呢


🙉答案是 D 啦~

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

本题的主要考点:“字符串结束标记的理解和应用”

💡本题的解题关键:

  • \0是字符串得结束标记

❗特别注意:

  • 对于字符串来说,只要遇到\0就会结束读取、打印剩余的字符

  • \0ASCII值为0,即0 == ‘\0’,所以对于上面c[2]就相当于是结束标记位置,所以只会打印前面的内容

✨这也就是为什么这道题选D啦~


📕考点:数组引用操作符的理解的和应用

2、 若有定义:int a[2][3];,以下选项中对 a 数组元素正确引用的是( )

  • A:a[2][0]

  • B:a[2][3]

  • C:a[0][3]

  • D:a[1>2][1]

🙈同学们觉得答案是什么呢


🙉答案是 D 啦~

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

本题主要考点:“数组引用操作符的理解的和应用”

💡本题的解题关键:

  • 理解[ ]操作符

👉相信同学们对于排除法得出正确选项并不难

❓但如何理解D 这个正确选项呢?

  • 相信同学们对[1>2]不太理解:

    • 其实1>2在这里理解为表达式,我们需要先进行判断其表达式真假,利用其返回值【:返回1 :返回0】来确定引用的位置
  • 所以1>2,返回0,即a[0][1],不存在行和列越界

✨这也就是为什么选D啦~


📘考点:字符数组初始化的理解和应用

3、 在下面的字符数组定义中,哪一个有语法错误( )

  • A: char a[20]="abcdefg";

  • B: char a[]="x+y=5.";

  • C: char a[15];

  • D: char a[10]='5';

🙈同学们觉得答案是什么呢


🙉答案是 D 啦~

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

本题主要考点:“字符数组初始化的理解和应用”

💡解题关键:

  • 字符常量不能对数组进行初始化

我们来详看选项:

  • 🔴选项B数组内初始化后为:{'x','+','y','=','5','.' }

  • 🟠选项C数组定义后,因为没有进行初始化,所以内部元素为随机值,但定义是没有错误的

  • 🟡选项D用字符常量初始化,是错误

    • 如果改成char a[10]={'5'};正确

💥特别注意:

  • 建议在定义数组的同时对数组进行初始化【Eg:char a[100] = {0},即将整个字符数组内初始化成\0

  • 以防数组内存在随机值的情况

✨这也就是这题为什么选D啦~


📙考点:变长数组的理解和应用

4、 下列定义数组的语句中正确的是【多选】( )

  • A:
#define size 10char str1[size], str2[size+2];
  • B: char str[];

  • C: int num['10'];

  • D: int n=5; int a[n][n+2];

🙈同学们觉得答案是什么呢


🙉答案是 AC 啦~

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

本题主要考点:“`变长数组的理解和应用”

💡解题关键:

  • 定义数组的空间大小只能用常量

➡️ 让我们一起来解题吧~

  • 🔴A选项:宏替换,在预处理阶段就会将的内容替换到程序内,所以替换完为char str1[10],str2[12]

  • 🟠B选项:非法定义,一维数组必须定义数组元素个数【即空间大小

  • 🟡C选项:字符'0',转换成十进制为48,所以最终为int num[48];

  • 🟢D选项:数组定义大小不能为 变量

综上:

  • 我们依次判断下来就可发现为什么选AC啦~

📓考点:二维数组解引用的理解和应用

5、 已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】( )

  • A: *(X[i]+j)

  • B: *(X+i)[j]

  • C:*(X+i+j)

  • D: *(*(X+i)+j)

🙈同学们觉得答案是什么呢


🙉答案是 BC 啦~

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

本题主要考点:“二维数组解引用的理解和应用”

💡解题关键:

  • 解引用操作符[]等价于*()

➡️让我们一个选项一个选项来看看吧~

  • 🔴A选项:*(X[i]+j) == X[i][j],正确

  • 🟠B选项:[]操作符的优先顺序高于*操作符,所以(X+i)先与[j]结合,即*(*(X+j+i)) == *(X[j+i]+0) == X[j+i][0],这样就越界了,错误

  • 🟡C选项:同理*(X+i+j) == X[i+j][0],数据越界,错误

  • 🟢D选项: *(*(X+i)+j) == *(X[i]+j) == X[i][j],正确

综上:

  • 这也是为什么选BC啦~

📖编程题【全面深度解析】

🏷️【牛客网题号: HJ10 字符个数统计】【难度:简单】

1、 编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次

例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3

  • 数据范围: 0 <= n <= 500

  • 输入描述: 输入一行没有空格的字符串

  • 输出描述: 输出 输入字符串 中范围在(0~127,包括0和127)字符的种数

🔍题目传送门:OJ链接

示例:输入:abc 输入:aaa输出:3     输出:1

💡解题关键:

  • 利用字符的本质还是整型,即利用每个字符的ASCII来进行统计

➡️思路: 运用哈希表的思想

  • 1️⃣因为题目规定出现的字符都是ASCII值小于127,所以可以创建一个大小为128(预留\0的位置)的table数组【即每个字符的ASCII对应着数组的下标】,并将其初始化为0

  • 2️⃣遍历字符串,将遇到的每个字符对应的ASCII值作为下标,在table数组中将此位置标记1【意味着这个下标作为ASCII值时所对应的字符已被统计】

  • 3️⃣统计完字符串后,遍历tale数组,将数组内元素大小为非0的位置个数统计出来,便是字符个数

👉实现:

int main(){    char arr[501] = {'\0'};    int table[128] = {0};    int sum = 0;    while(scanf("%s",arr) != EOF);    {      //1.    for (int i = 0; i < strlen(arr); ++i)    {    //2. table[arr[i]]++;    } //3.    for(int i = 0; i < 128; ++i)    { if(table[i]) { sum++; }    } printf("%d",sum);    }return 0;}

🏷️【leetcode 题号:169. 多数元素】【难度:简单】

2、 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素

🔍题目传送门:OJ链接

示例:输入:[3,2,3]输出:3输入:[2,2,1,1,1,2,2]输出:2

特别注意:

  • 一个数组中有一个数字出现次数大于 n/2,说明这个数字出现次数最多

➡️思路: 互拼思路 – 打擂台

1️⃣创建一个计数器,第 0个字符开始,假设它就是最多的那个数字(即擂台主),存起来并往后遍历数组,与数组中的每个数字进行比较(与剩余的数字进行打擂台)

  • 若相同,则计数器+1【即遇到队友,人数+1

  • 不相同,则计数器-1【即遇到敌人,对擂台主的人数进行消耗-1

2️⃣依据计数器来判断哪个数字为出现次数最多

  • 当计数器为0时,则表示前面的数字互相消耗完,即前面出现的数字都不是出现最多次的,则表示本轮互拼完毕

    • 从下一个数字开始当擂台主,重新与后面数组中的数字进行互拼
  • 当数组遍历完时,若计数器>0,则说明当前的擂台主为出现次数最多的数字

➡️即计数器0的时候,才需要开启下一轮,否则就比较下去

图例:

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

  • 1️⃣第一次进入数组,让第一个数字当擂台主
    【第八章】 C语言之牛客网&力扣刷题笔记 【点进来保证让知识充实你一整天】
  • 2️⃣往后开始与数字打擂台

【第八章】 C语言之牛客网&力扣刷题笔记 【点进来保证让知识充实你一整天】
因为擂台主对手不相同,计数器-1,此时计数器为0

  • 3️⃣本轮互拼完毕,开启下一轮:让下一个数字当擂台主
    【第八章】 C语言之牛客网&力扣刷题笔记 【点进来保证让知识充实你一整天】
  • 4️⃣遇到队友,计数器+1
    【第八章】 C语言之牛客网&力扣刷题笔记 【点进来保证让知识充实你一整天】
  • 5️⃣全部数字比较完后,擂台主为答案
    【第八章】 C语言之牛客网&力扣刷题笔记 【点进来保证让知识充实你一整天】

所以出现次数最多的数字为3

👉实现:

int majorityElement(int* nums, int numsSize){int count = 1;int tmp = nums[0];for (int i = 1; i < numsSize; i++) {if (tmp == nums[i]){//与保存的字符相同则计数+1count++;} else {//与保存的字符不同则计数-1count--;//计数为0表示有可能保存的字符不是最多的字符//换下一个if (count == 0) {tmp = nums[i + 1];}}}return tmp;}

✨总结

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

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

毕竟,

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

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

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