【第八章】 C语言之牛客网&力扣刷题笔记

🎒选择题【全面深度剖析】
📗 考点:字符串结束标记的理解和应用
1、 如下程序的运行结果是( )
char c[5]={'a', 'b', '\0', 'c', '\0'};
printf("%s", c); A:
‘a’ ‘b’B:
ab \0 c \0- C:
ab c
- C:
D:
ab
:see_no_evil:大家觉得答案是什么呢
:hear_no_evil:答案是 D 啦~
:speak_no_evil: 如果有疑惑,且听我细细分析呀
本题的主要考点:"字符串结束标记的理解和应用"
💡本题的解题关键:
\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]
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 D 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“数组引用操作符的理解的和应用”
💡本题的解题关键:
- 理解
[ ]操作符
👉相信同学们对于排除法得出正确选项并不难
❓但如何理解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';
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 D 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“字符数组初始化的理解和应用”
💡解题关键:
- 字符常量不能对数组进行初始化
❗我们来详看选项:
🔴选项
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];
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 AC 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“`变长数组的理解和应用”
💡解题关键:
- 定义数组的空间大小只能用
常量
➡️ 让我们一起来解题吧~
🔴
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)
:see_no_evil:同学们觉得答案是什么呢
:hear_no_evil:答案是 BC 啦~
:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀
本题主要考点:“二维数组解引用的理解和应用”
💡解题关键:
- 解引用操作符
[]等价于*()
➡️让我们一个选项一个选项来看看吧~
🔴
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)字符的种数
:mag:题目传送门:OJ链接
示例: 输入:abc 输入:aaa 输出:3 输出:1
💡解题关键:
- 利用
字符的本质还是整型,即利用每个字符的ASCII来进行统计
➡️思路: 运用哈希表的思想
1️⃣因为题目规定出现的字符都是
ASCII值小于127,所以可以创建一个大小为128(预留\0的位置)的table数组【即每个字符的ASCII对应着数组的下标】,并将其初始化为02️⃣遍历字符串,将遇到的每个字符对应的
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 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素
:mag:题目传送门: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;
} ✨总结
综上,特辑的第八章呐:lollipop:~
让我们大家一同在平凡的生活中奔赴热爱吧~
毕竟,
“热爱的东西 永远不要说放弃”
:dizzy:如果有错误❌,欢迎指正呀:dizzy:
:sparkles:如果觉得收获满满,可以点点赞👍支持一下哟~:sparkles:


腾讯成长空间 3086人发布