💕全网最火特辑💕 第八章 C语言之牛客网刷题📖笔记 【✨点进来保证让知识充实你一整天】
作者介绍:
🎓作者: 热爱编程不起眼的小人物🐐
🔎作者的Gitee:代码仓库
📌系列文章推荐:1.【第一章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
2.【第二章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
3.【第三章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
4.【第四章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
5.【第五章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
6.【第六章】 C语言之牛客&力扣刷题笔记 【点进来保证让知识充实你一整天】
7. 第七章】 C语言之牛客网&力扣刷题笔记 【点进来保证让知识充实你一整天】
📒我和大家一样都是初次踏入这个美妙的“元”宇宙🌏 希望在输出知识的同时,也能与大家共同进步、无限进步🌟
🌐为大家推荐一款刷题网站呀👉点击跳转
以下题目&算法思想,都可以从此网站中找到并参考学习哟~
前言
同学们,新的学期早已开始啦😚~相信大家都想在这学期偷偷地卷”死“同学吧😇大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!✊
星光不负赶路人,时光不有心人 只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!
以下内容干货满满,跟上步伐吧~
🎒选择题【全面深度剖析】
📗 考点:字符串结束标记的理解和应用
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
就会结束读取、打印剩余的字符 -
\0
的ASCII
值为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 10
char 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:
- 1️⃣第一次进入数组,让第一个数字当擂台主
- 2️⃣往后开始与数字打擂台
因为擂台主
与对手
不相同,计数器-1
,此时计数器为0
- 3️⃣本轮互拼完毕,开启下一轮:让下一个数字当
擂台主
- 4️⃣遇到
队友
,计数器+1
- 5️⃣全部数字比较完后,擂台主为答案
所以出现次数最多的数字为
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])
{
//与保存的字符相同则计数+1
count++;
}
else
{
//与保存的字符不同则计数-1
count--;
//计数为0表示有可能保存的字符不是最多的字符
//换下一个
if (count == 0)
{
tmp = nums[i + 1];
}
}
}
return tmp;
}
🌐 如何高效学习数据结构与算法?
数据结构与算法的学习还是得基础知识
➕自己动手
同步进行
如果是初学者,需要找一个可以在线练习得网站,我建议你去牛客网多练习呀(快点击跳转学起来吧!)
就如上述讲解的面试OJ题,牛客网内还有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,看看别人的思路,别人的代码,也许就能豁然开朗~
✨总结
综上,特辑的第八章呐🍭~
让我们大家一同在平凡的生活中奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨