栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【第八章】 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', '', 'c', ''};

printf("%s", c);
  • A:‘a’ ‘b’

  • B:ab c

  • C:ab c

  • D: ab

大家觉得答案是什么呢


答案是 D 啦~

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

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

本题的解题关键:

  • 是字符串得结束标记

❗特别注意:

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

  • 的ASCII值为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},即将整个字符数组内初始化成】

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

✨这也就是这题为什么选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(预留的位置)的table数组【即每个字符的ASCII对应着数组的下标】,并将其初始化为0

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

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

实现:

int main()
{
    char arr[501] = {''};
    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;
}

✨总结

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

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

毕竟,

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

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

✨如果觉得收获满满,可以点点赞支持一下哟~✨

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850254.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号