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

发布时间:2022-06-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了【第五章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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


作者介绍F1a;

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

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

📒我和大家一样都是初次踏入这个美妙的“元”宇宙🌏 希望在输出知识的同时,也能与大家共同进步、无限进步🌟


文章目录

  • 💕全网最火特辑💕 第五章 C语言之牛客网刷题📖笔记 【✨点进来保证让知识充实你一整天】
  • 前言
  • 🎒选择题【全面深度剖析】
    • 📗 考点:字符ASCII计算与转换的理解和应用
    • 📕考点:while判断条件的理解的和应用
    • 📘考点:大小字母字符转换的理解和应用
    • 📙考点:if条件语句的理解和应用
    • 📓考点:跳出多层循环方法的理解和应用
  • 📖编程题【全面深度解析】
    • 🏷️【牛客网题号: JZ53 数字在升序数组中出现的次数】【难度:简单
    • 🏷️【 leetcode 题号:面试题 05.06. 整数转换】【难度:简单】
  • ✨总结


前言

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

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

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

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


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

📗 考点:字符ASCII计算与转换的理解和应用

1、 如下程序的功能是( )

#include <stdio.h>

int @H_59_126@main()
{
	char ch[80] = "123abcdEFG*&amp;";
	int j;
	puts(ch);
	for(j = 0; ch[j] != ''; j++)
	{
		if(ch[j] >= 'A' && ch[j] <= 'Z')
		{
			ch[j] = ch[j] + 'e' - 'E';
		}
	}
	puts(ch);
	
	return 0;
}
  • A:字符数组ch的长度

  • B:将数字字符串ch转换成十进制数

  • C:将字符数组ch中的小写字母转换成大写

  • D: 将字符数组ch中的大写字母转换成小写

🙈大家觉得答案是什么


🙉答案是 D 啦~

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

本题的主要考点:@H_100_304@“字符ASCII计算与转换的理解和应用”

💡本题的解题关键:

  • 理解大小写字母所对应的ASCII值的转换

❗特别注意:

十进制八进制十六进制二进制字符
651014101000001A
971416101100001a
  • ⬆️由上表中可得知:大小写字母所对应的ASCII的差值为32

    • 'a' - 'A' = 32

📍经过上述的理解,我们便可得知:由大写字母转换为小写字母需要在原有ASCII上加32

  • 所以我们边很容易可以理解题目中 字符加上’e’ - 'E’的差值 这句代码的含义:ch[j] + 'e' - 'E' == ch[j] + 32

➡️本质上:就是想让大写字母转换为小写字母

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


📕考点:while判断条件的理解的和应用

2、 对于代码段,下面描述正确的是( )

t=0;

while(PRintf("*"))
{
	t++;
	if (t<3)
		break;
}
  • A:其中循环控制表达式与0等价

  • B:其中循环控制表达式与'0'等价

  • C:其中循环控制表达式是不合法的

  • D:以上说法都不对

👉同学们做这些题目的时候一定要耐心哦~

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


🙉答案是 B 啦~

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

本题主要考点:“while判断条件的理解的和应用”

💡本题的解题关键:

  • 理解while循环的判断条件

特别注意:

  • 本题的循环判断条件为printf的返回值

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

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

⬆️由上我们可知:printf的返回值为打印的字符的个数

👉简单来说:就是返回字符串中字符的个数

➡️回到题目:

  • printf的返回值作为循环的判断条件

    • 此时 print(“*”)的返回值为1,循环判断条件恒为

💫所以此时循环条件是与‘0’等价的

💥注意:字符'0'不是0,所以字符0用的是其ASCII值作为判断依据,又因为其ASCII值是非0值,所以判断恒为

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


📘考点:大小字母字符转换的理解和应用

3、 以下程序运行时,若输入 1abcedf2DF<回车> 输出结果是( )

#include <stdio.h>
int main()
{
	char ch;
	while ((ch = getchar()) != 'n')
	{
		if (ch % 2 != 0 && (ch >= 'a' && ch <= 'z'))
		{
			ch = ch - 'a' + 'A';
		}		
		putchar(ch);
	} 
	printf("n");
	return 0;
}

  • A: 1abcedf2df

  • B: 1ABCEDF2DF

  • C: 1AbCEdf2df

  • D: 1aBceDF2DF

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


🙉答案是 C 啦~

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

本题主要考点:“大小字母字符转换的理解和应用”

💡解题关键:

  • 本题与第一题类似,主要核心关键是理解大小写字母字符对应ASCII的数值转换

➡️简单来说:

  • 大写字母转成小写字母,需要大写字母对应的ASCII加上32

特别注意:

  • 1️⃣本题中多出ch % 2 != 0的条件,表示这次转换的字母的ASCII值要为奇数

  • 2️⃣ch = ch - 'a' + 'A';可知字母是要从小写转为大写

👉综上:

  • 只要ch字符满足ASCII值既是奇数又是小写字母,就可以转换成大写字母

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


📙考点:if条件语句的理解和应用

4、 下列条件语句中,功能与其他语句不同的是( )

  • A: if(a) printf("%dn",x); else printf("%dn",y);

  • B: if(a==0) printf("%dn",y); else printf("%dn",x);

  • C: if (a!=0) printf("%dn",x); else printf("%dn",y);

  • D: if(a==0) printf("%dn",x); else printf("%dn",y);

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


🙉答案是 D 啦~

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

本题主要考点:“`if条件语句的理解和应用”

💡解题关键:

  • 只需要将某个选项假设为正确,找出不同的选项即可

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

  • 假设A选项为正确的,即可知:

    -1️⃣ a为非0数即为,就打印x的值

    -2️⃣a为0即为时,就打印y的值

综上:

  • 我们依次判断下来就可发现D选项是四个选项中与众不同的,所以这也是为什么选D啦~

📓考点:跳出多层循环方法的理解和应用

5、 我们知道C语言的 break 语句只能跳出离它最近的一层循环,可是有时候我们需要跳出多层循环,下列跳出多层循环的做法正确的是【多选】( )

  • A: 将程序写成函数用return结束函数,便可跳出循环

  • B: 修改外层循环条件例如

for( int i = 0 ; i < MAX1 ; i ++ )
{
	for( int j = 0 ; j < MAX2 ; j ++ )
	{
		if( condition )
		{
			i = MAX1;
			break;
		}
	}
}
  • C:在外层循环设置判断条件例如
for( ; symbol != 1 && condition2 ; )
{
	for( ; symbol != 1 && condition3 ; )
	{
		if( condition1 )
			symbol = 1 ;
	}
}
  • D:在外层循环后面加入break例如
for( ; condition2 ; )
{
	for( ; condition3 ; )
	{
		if( condition1 )
			symbol = 1 ;
	}
 	if( symbol == 1 )
		break ;
}

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


🙉答案是 ABCD 啦~

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

本题主要考点:“跳出多层循环方法的理解和应用”

💡解题关键:

  • 细心分析即可

特别注意:

  • 1️⃣代码为伪代码

  • 2️⃣condition代表逻辑表达式

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

  • 🔴A选项的方法简洁明了,可直接结束程序

  • 🟠B选项外层循环有限制,是通过判断条件来限制循环的

  • 🟡C选项增加了外层循环设置判断条件

  • 🟢D选项在外层循环内增添了跳出循环的条件

综上: 就是对于跳出多层循环的方法的整合,大家也可借鉴这些方法去跳出多重循环啦~


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

🏷️【牛客网题号: JZ53 数字在升序数组中出现的次数】【难度:简单】

1、 给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数

数据范围: 0≤n≤1000 , 0≤k≤100 ,数组中每个元素的值满足 0≤val≤100

🔍题目传送门:OJ链接

示例:
	输入:[1,2,3,3,3,3,4,5] , 3 

	
	输出:  4

💡解题关键:

➡️思路一: 暴力搜寻法

  • 即只需要一个计数器,去遍历数组记录出现相同的数字个数即可

👉实现:

int GetNumberOfK(int* data, int dataLen, int k ) 
{
    int n = dataLen;
    int i = 0;
    int count = 0;
    for(i=0;i<n;i++)
    {
        if(*data == k)
        {
            count++;
        }
        data++;
    }
    
    return count;
}

但此时时间复杂度为O(N),不是很符合题意

➡️思路二: 二分查找法

  • 因为题目为有序数组,那我们便可知可用二分查找法
  • 又因为要搜寻目标值是连在一起的,因此我们只要查找目标范围的下界上界

1️⃣先二分找到最左边要查找的数字位置 【上界

2️⃣再二分查找最右边要查找的数字的位置【下界

▶️两个位置相减+1就是长度

  1. mid 比要找的值大:则要找的数字肯定在右边, left = mid + 1;

  2. mid 比要找的值小:则要找的数字肯定在左边, right = mid - 1;

  3. mid 刚好与要找的值相同:

    • 找最左边数字【上界】:如果mid就是left(即left的左边不再有要查找的数字),则返回mid就行,否则重置right=;mid-1,把中心不断向左偏移,找到偏左位置的最后一个目标数字即可
    • 找的最右边数字【下界】:如果mid就是right(即right的右边边不再有要查找的数字),则返回mid就行,否则重置left=mid+1,把中心不断向右偏移,找到偏右位置的最后一个目标数字即可

👉示例:

进入二分查找,发现第一次mid == k,便可以根据mid查找到上界下界,得出范围

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


1️⃣ 查找最左边的数字【上界

  • 将中心往左偏移、寻找【right = mid - 1

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

  • 直至走到左边最后一个要查找数字的位置【标志:再往左走就不是要查找的数字】

进入二分查找,发现第二次mid == k,便可以根据mid查找到上界下界,得出范围

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


2️⃣查找最右边的数字【下界

  • 将中心往右偏移、寻找【left = mid + 1

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


3️⃣综上:用最终返回的left 减去right+1即可得出长度(即个数

❗且此时的时间复杂度为O(logN)

👉实现:

int get_last_or_First_idx(int *data, int len, int k, int flag) 
{
	//flag:0-找左边, 1-找右边
	int left = 0, right = len - 1, mid;

	while (left <= right) 
	{
		mid = left + (right - left) / 2;

		if (data[mid] > k)
			right = mid - 1;

		else if (data[mid] < k)
			left = mid + 1;

		else //mid == k
		{
			if (flag == 0) 
			{
				//flag==0时,找最左边的数字
				if (mid == left || data[mid - 1] != k) 
					return mid;
				else 
					right = mid - 1;//把中心向左推
			}
			else 
			{
				//flag==1时,找最右边的数字
				if (mid == right || data[mid + 1] != k) 
					return mid;
				else 
					left = mid + 1;//把中心向右推
			}
		}
	} 
	return -1;
}

int GetNumberOfK(int* data, int dataLen, int k) 
{
	if (dataLen == 0) 
		return 0;

	int left = get_last_or_first_idx(data, dataLen, k, 0);

	int right = get_last_or_first_idx(data, dataLen, k, 1);

	if (left == -1 && right == -1) 
		return 0; //表示没有找到k这个数据

	return right - left + 1;
}

🏷️【 leetcode 题号:面试题 05.06. 整数转换】【难度:简单】

2、 整数转换。编写一个函数,确定需要改变几个位才能将整数 A 转成整数 B

  • 1️⃣A,B范围在[-2147483648, 2147483647]之间

🔍题目传送门:OJ链接

示例:
	输入:A = 29或者0b11101), B = 15(或者0b01111) 

	输出:2 

	输入:A = 1,B = 2
	
	输出:2

➡️本质:其实问需要修改多少个比特位,看有多少个比特位不同,因为有多少位不同就修改多少位

💡解题关键:

  • 1️⃣只需要将两个数字^(异或)在一起【相同位上的数字相同则位为0,不同则为1

  • 2️⃣再将异或后的二进制序列进行计数,计算里面有几个1,即知道有几位比特位不相等

👉实现:

    //29
    //00000000000000000000000000011101
    //15
    //00000000000000000000000000001111
    //c
    //00000000000000000000000000010010
int convertInteger(int A, int B)
{
    int c = A ^ B;
    int i = 0;
    int count = 0;
    for(i = 0;i<32;i++)
    {
        int d = c & 1;
        if(d == 1)
        {
            count++;
            c = c >> 1;
        }
        else
        {
            c = c >> 1;
        }
    }
    return count;
}

✨总结

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

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

毕竟,

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

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

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

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

脚本宝典总结

以上是脚本宝典为你收集整理的【第五章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】全部内容,希望文章能够帮你解决【第五章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。