【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day8

🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏:************************************************************************************************************************************************************************************************************************************************************《C语言》《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》****************************************************************************************************************************************************************************************************************************************************************

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言:我们距离学习完C语言已经很久了,在数据结构学完后,博主准备通过这16天的强化训练和大家一起回顾C语言的知识,今天依旧是五道选择和两道编程题,希望大家能有所收获。


目录

选择题:

编程题:

1.字符个数统计

2.多数元素


选择题:

1、如下程序的运行结果是( )
A: 'a' 'b' B: ab\0c\0 C: ab c D: ab

cpp 复制代码
char c[5]={'a', 'b', '\0', 'c', '\0'};
printf("%s", c);

答案解析:
正确答案:D

字符串的结束标志是'\0',而'\0'的ASCII值是0,而c[2]被初始化为0,就相当于是'\0',故字符串打印的内容只有"ab"

2、若有定义: int a[2][3]; ,以下选项中对 a 数组元素正确引用的是( )

A: a[2][0] B: a[2][3] C: a[0][3] D: a[1>2][1]

答案解析:
正确答案:D

本题主要考虑数组越界访问的情况,二维数组的行和列都是从0开始的,对于a数组来说,行下标最大是1,列下标最大是2, D选项中1>2表达式的值是0,是正确的,其他选项行和列都可能存在越界,A是行越界,B是行和列都越界,C是列越界。

3、在下面的字符数组定义中,哪一个有语法错误( )

A: char a[20]="abcdefg"; B: char a[]="x+y=5."; C: char a[15]; D: char a[10]='5';

答案解析:
正确答案:D

D中的'5'是一个字符常量,不能给字符型数组a初始化

4、下列定义数组的语句中正确的是【多选】( )
A.

cpp 复制代码
#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选项:宏替换,没问题;B选项:非法定义,一维数组必须定义数组元素个数;C选项:字符'0',转换成十进制为48,所以该选项最终为int num[48];D选项:错误,数组定义下角标不能为变量,注:C99标准中支持了使用变量,这里不做特殊考虑

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]就是第i行的数组名,数组名表示首元素的地址,X[i]表示第i行的第一个元素的地址,+j后就是第i行下标为j的元素的地址,整体解引用就是X[i][j],A正确。B选项因为[]的优先级高于*,所以代码相当于**((x+i)+j),X+i+j后就越界了,并不代表X[i][j],所以错误。C选项也明显不对,X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行,就越界了,C错误。D选项是标准的指针形式访问二位数组的一个元素


编程题:

1.字符个数统计

题目链接: 字符个数统计_牛客题霸_牛客网

题目描述:

题目示例:

代码演示:

cpp 复制代码
#include <stdio.h>
#include<string.h>

int main() {
    char s[501]={0};
    scanf("%s",s);
    int count[128]={0};
    int sum=0;
    for(int i=0;i<strlen(s);i++)
    {
        count[s[i]]++;
    }
    for(int i=0;i<128;i++)
    {
        if(count[i])
        {
            sum++;
        }
    }
    printf("%d",sum);
    return 0;
}

题目解析:

  • 这道题思路比较简单,因为题目圈定出现的字符都是 ascii 值小于127的字符,因此只需要定义一个标记数组大小为127 ,然后将字符作为数组下标在数组中进行标记,若数组中没有标记过表示第一次出现,进行计数,否则表示重复字符。
  • 示例:查表法, "aca" ,首先把a字符( ascii 值为 97 )作为下标,将标记数组的第 97 位置 1 ,下次如果还有 a 字符出现,到下标 'a' 或者 97 的位置一看是1就表示a已经统计过了。

2.多数元素

题目链接: 169. 多数元素 - 力扣(LeetCode)

题目描述:

题目示例:

代码演示:

cpp 复制代码
int cmp(const void* a, const void* b)
{
    return  *(int*)a - *(int*)b;
}
int majorityElement(int* nums, int numsSize) {
    qsort(nums,numsSize,sizeof(int),cmp);
    return nums[numsSize/2];
}

题目解析:

  • 利用 qsort 函数对数组排序,因多数元素出现次数大于 n/2,排序后数组中间位置(numsSize/2 处 )元素必为多数元素,直接返回该位置元素 。代码通过排序找中间值的方式,简洁解决多数元素问题,符合题目条件及要求

往期回顾:

【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day4

【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day5

【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day6

【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day7

结语:本篇博客就到此结束了,C 语言的精髓在于对细节的掌控和对底层的理解,这需要持续实践。愿你带着这份训练中获得的思维与习惯,在编程路上走得更稳、更远。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

相关推荐
chao_78916 小时前
Union 和 Optional 区别
开发语言·数据结构·python·fastapi
hsjkdhs16 小时前
C++之类的组合
开发语言·c++·算法
奔跑吧邓邓子17 小时前
【C++实战(57)】C++20新特性实战:解锁C++编程新姿势
c++·实战·c++20·c++20新特性
charlie11451419117 小时前
精读 C++20 设计模式:行为型设计模式——观察者模式
c++·学习·观察者模式·设计模式·程序设计·c++20
疯狂的Alex17 小时前
【C#避坑实战系列文章16】性能优化(CPU / 内存占用过高问题解决)
开发语言·性能优化·c#
象骑士Hack17 小时前
dev c++工具下载 dev c++安装包下载 dev c++软件网盘资源分享
开发语言·c++
青草地溪水旁17 小时前
设计模式(C++)详解——观察者模式(Observer)(2)
c++·观察者模式·设计模式
charlie11451419117 小时前
精读 C++20 设计模式:行为型设计模式 — 备忘录模式
c++·学习·设计模式·c++20·备忘录模式
迎風吹頭髮17 小时前
UNIX下C语言编程与实践15-UNIX 文件系统三级结构:目录、i 节点、数据块的协同工作机制
java·c语言·unix
迎風吹頭髮17 小时前
UNIX下C语言编程与实践6-Make 工具与 Makefile 编写:从基础语法到复杂项目构建实战
运维·c语言·unix