全网最火特辑 第五章 C语言之牛客网刷题笔记 【?点进来保证让知识充实你一整天】
文章图片
作者介绍:
作者: 热爱编程不起眼的小人物
作者的Gitee:代码仓库
系列文章推荐:
1.【第一章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
2.【第二章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
3.【第三章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
4.【第四章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
我和大家一样都是初次踏入这个美妙的“元”宇宙 希望在输出知识的同时,也能与大家共同进步、无限进步
前言
文章目录
- 全网最火特辑 第五章 C语言之牛客网刷题笔记 【?点进来保证让知识充实你一整天】
- 前言
- 选择题【全面深度剖析】
- 考点:字符ASCII计算与转换的理解和应用
- 考点:while判断条件的理解的和应用
- 考点:大小字母字符转换的理解和应用
- 考点:if条件语句的理解和应用
- 考点:跳出多层循环方法的理解和应用
- 编程题【全面深度解析】
- ?【牛客网题号: JZ53 数字在升序数组中出现的次数】【难度:简单】
- ?【 leetcode 题号:面试题 05.06. 整数转换】【难度:简单】
- ?总结
同学们,新的学期早已开始啦~相信大家都想在这学期偷偷地卷”死“同学吧大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!?以下内容干货满满,跟上步伐吧~
星光不负赶路人,时光不有心人 只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!
选择题【全面深度剖析】
考点:字符ASCII计算与转换的理解和应用 1、 如下程序的功能是( )
#include int main()
{
char ch[80] = "123abcdEFG*&";
int j;
puts(ch);
for(j = 0;
ch[j] != '\0';
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 啦~
本题的主要考点:“字符ASCII计算与转换的理解和应用”本题的解题关键:
- 理解大小写字母所对应的
ASCII
值的转换
十进制 | 八进制 | 十六进制 | 二进制 | 字符 |
---|---|---|---|---|
65 | 101 | 41 | 01000001 | A |
97 | 141 | 61 | 01100001 | a |
- ??由上表中可得知:大小写字母所对应的
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
的返回值
简单来说:就是返回![]()
文章图片
![]()
文章图片
??由上我们可知:printf
的返回值为打印的字符的个数
字符串中字符的个数
??回到题目:
- 将
printf
的返回值作为循环的判断条件
- 此时 print(“*”)的返回值为
1
,循环判断条件恒为真
- 此时 print(“*”)的返回值为
‘0’
等价的注意:字符
'0'
不是0
,所以字符0用的是其ASCII值作为判断依据,又因为其ASCII值是非0值,所以判断恒为真
【寒假刷题特辑|【第五章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】】?这也就是为什么选
B
啦~考点:大小字母字符转换的理解和应用 3、 以下程序运行时,若输入
1abcedf2df<回车>
输出结果是( )#include
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("%d\n",x); else printf("%d\n",y);
- B:
if(a==0) printf("%d\n",y); else printf("%d\n",x);
- C:
if (a!=0) printf("%d\n",x); else printf("%d\n",y);
- D:
if(a==0) printf("%d\n",x); else printf("%d\n",y);
同学们觉得答案是什么呢如果同学们有疑惑,且听我细细分析呀
答案是 D 啦~
本题主要考点:“`if条件语句的理解和应用”解题关键:
- 只需要将某个选项假设为正确,找出不同的选项即可
- 假设
A
选项为正确的,即可知:
-1?? a为非0数即为真
,就打印x
的值
-2??a为0即为假
时,就打印y
的值
- 我们依次判断下来就可发现
D
选项是四个选项中与众不同的,所以这也是为什么选D
啦~
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
- 空间复杂度 O(1)
- 时间复杂度 O(logn)
示例:
输入:[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
但此时时间复杂度为??思路二: 二分查找法O(N)
,不是很符合题意
- 因为题目为
有序数组
,那我们便可知可用二分查找法
- 又因为要搜寻目标值是连在一起的,因此我们只要查找目标范围的
下界
和上界
上界
】2??再二分查找最右边要查找的数字的位置【
下界
】??两个位置相减+1就是长度
- mid 比要找的值大:则要找的数字肯定在右边, left = mid + 1;
- mid 比要找的值小:则要找的数字肯定在左边, right = mid - 1;
- mid 刚好与要找的值相同:
- 找最左边数字【
上界
】:如果mid就是left(即left的左边不再有要查找的数字),则返回mid就行,否则重置right=mid-1,把中心不断向左偏移,找到偏左位置的最后一个目标数字即可 - 找的最右边数字【
下界
】:如果mid就是right(即right的右边边不再有要查找的数字),则返回mid就行,否则重置left=mid+1,把中心不断向右偏移,找到偏右位置的最后一个目标数字即可
- 找最左边数字【
进入二分查找,发现第一次?且此时的时间复杂度为mid == k
,便可以根据mid查找到上界
和下界
,得出范围
![]()
文章图片
1?? 查找最左边的数字【上界
】
进入二分查找,发现第二次
- 将中心往左偏移、寻找【
right = mid - 1
】
![]()
文章图片
- 直至走到左边最后一个要查找数字的位置【标志:再往左走就不是要查找的数字】
mid == k
,便可以根据mid查找到上界
和下界
,得出范围
![]()
文章图片
2??查找最右边的数字【下界
】
3??综上:用最终返回的
- 将中心往右偏移、寻找【
left = mid + 1
】
![]()
文章图片
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]之间
示例:
输入: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语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】](https://img.it610.com/image/info8/1548f355cde9450d8f4b4bebbdfdadf4.jpg)
文章图片
推荐阅读
- 麦克算法|第12节课 图
- Dubbo-go 服务代理模型
- linux|ubuntu20.04安装微信和QQ,腾讯会议,以及一些其他实用软件
- java|教你代码实现抢红包功能
- java|2022蓝桥杯备赛 python 真题大联赛 第1期
- 学习|使用IOS快捷指令打开任意支付宝小程序
- 笔记|单调栈详解-基于LeetCode的题目
- 笔记|LeetCode每日一题题解(1189. “气球” 的最大数量)
- 笔记|LeetCode每日一题题解(917. 仅仅反转字母-双指针-python和C++)