【C语言好题系列三】

文章目录

  • 学习导航
  • [一. 选择题](#一. 选择题)
  • [二. 编程题(力扣/牛客网)](#二. 编程题(力扣/牛客网))
  • [三. 总结](#三. 总结)

学习导航

一. 选择题

  1. 如下程序的运行结果是(D)
c 复制代码
char c[5]={'a', 'b', '\0', 'c', '\0'};
printf("%s", c);

A: 'a' 'b' B: ab\0c\0 C: ab c D: ab

答案解析:

正确答案:D

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

  1. 若有定义: int a23; ,以下选项中对 a 数组元素正确引用的是(D)
    A: a20 B: a23 C: a03 D: a1\>21

答案解析:

正确答案:D

本题主要考虑数组越界访问的情况,二维数组的行和列都是从0开始的,对于a数组来说,行下标最大是1,列下标最大是2,

D选项中1>2表达式的值是0,是正确的,其他选项行和列都可能存在越界,A是行越界,B是行和列都越界,C是列越界。

  1. 在下面的字符数组定义中,哪一个有语法错误(D)
    A: char a20="abcdefg";
    B: char a\[\]="x+y=5.";
    C: char a15;
    D: char a10='5';

答案解析:

正确答案:D

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

  1. 下列定义数组的语句中正确的是【多选】(AC)
    A.#define size 10 char str1[size], str2[size+2];
    B: char str\[\]; C: int num'10'; D: int n=5; int ann+2;

答案解析:

正确答案:AC

A选项:宏替换,没问题;B选项:非法定义,一维数组必须定义数组元素个数;C选项:字符'0',转换成十进制为48,所以

该选项最终为int num48;D选项:错误,数组定义下角标不能为变量,注:C99标准中支持了使用变量,这里不做特殊考

虑。

  1. 已知 i,j 都是整型变量,下列表达式中,与下标引用 Xij 不等效的是【多选】(BC)
    A: *(Xi+j) B: *(X+i)j C: *(X+i+j) D: *( *(X+i)+j)

答案解析:

正确答案:BC

本题考查的是二维数组的元素访问,A选项是 正确的,Xi就是第i行的数组名,数组名表示首元素的地址,Xi表示第i行的第

一个元素的地址,+j后就是第i行下标为j的元素的地址,整体解引用就是Xij,A正确。B选项因为\[\]的优先级高于*,所以代

码相当于**((x+i)+j),X+i+j后就越界了,并不代表Xij,所以错误。C选项也明显不对,X是二维数组的数组名,数组名相当于第

一行的地址,X+i+j,跳过了i+j行,就越界了,C错误。D选项是标准的指针形式访问二位数组的一个元素

二. 编程题(力扣/牛客网)

  1. 编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次

    例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。

    数据范围: 0 <= n <= 500

    输入描述:输入一行没有空格的字符串。

    输出描述:输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。

    牛客网HJ10【难度:简单】

    示例:

c 复制代码
输入:abc 输入:aaa
输出:3 输出:1

1、【答案解析】: 这道题思路比较简单,因为题目圈定出现的字

符都是 ascii 值小于 127的字符,因此只需要定义一个标记数组大小为127 ,然后将字符作为数组下标在数组中进行标记,若数组中没有标记过表示第一次出现,进行计数,否则表示重复字符。

示例:查表法, "aca" ,首先把a字符( ascii 值为 97 )作为下标,将标记数组的第 97 位置 1 ,下次如果还有 a 字符出现,到下标 'a' 或者 97 的位置一看是1就表示a已经统计过了。

c 复制代码
#include <stdio.h>
int main()
{
	char tmp[501] = {0};
	while(~scanf("%s", tmp)) {
	char table[128] = {0}, *ptr = tmp;
	int count = 0;
	while(*ptr != '\0') {
	if (table[*ptr] != 1) {//判断字符ascii值作为下标的位置是否被标记过,是否是重复字符
	count++; //当前字符的位置没有被标记过表示没有出现过,则				计数+1
	}
	table[*ptr++] = 1;//将字符ascii值作为下标的位置进行标记置1
	}
	printf("%d\n", count);
	}
	return 0;

}

  1. 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
    leetcode 题号:169. 多数元素
c 复制代码
示例:
输入:[3,2,3]
输出:3
输入:[2,2,1,1,1,2,2]
输出:2

一个数组中有一个数字出现次数大于 n/2 ,从第 0 个字符开始,假设它就是最多的那个数字,遇到相同的数字则计数 +1 , 遇到不同的则计数 -1 ,其实就是互相消耗,等到计数为 0 的时候,表示本次互拼完毕,从下一个字符重新开始互拼,但是归根结底出现次数大于 n/2 的这个数字数量更多,因此也是最后保留的字符。

示例: "23335" 首先从字符 2 开始计数 1 ,遇到 3 ,不同则 -1 ,互拼消耗 重新从剩下的 "335" 开始的过程,这时候保存的字符为 3 ,遇到 3 则计数 +1 , 遇到5则计数 -1 ,在计数不为 0 时,走到末尾保存的字符就是个数超过n/2 的字符。

c 复制代码
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;
}

三. 总结

  1. 小编制作不易,如果对此时c语言小白的你有帮助,麻烦给个小小的赞,谢谢兄嘚l!

相关推荐
霸道流氓气质1 分钟前
基于 Spring 事务同步机制的事务后置动作收集器 Starter 实践
java·后端·spring
过期动态7 分钟前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
来一碗刘肉面17 分钟前
栈在递归中的应用
数据结构·算法
8K超高清27 分钟前
博冠获中国电影电视技术学会科技进步奖
人工智能·科技·算法·安全·接口隔离原则·智能硬件
皓月斯语35 分钟前
程序设计语言的特点
开发语言·数据结构·c++
超人不会飞_Jay39 分钟前
Go课程2
开发语言·后端·golang
刘小八44 分钟前
Spring AI Tool Calling 生产化:参数校验、权限控制与超时隔离
java·人工智能·spring
微石科技1 小时前
长期慢病如何做好居家管理?宁波微石科技星梦云康改善周期数据零散短板
大数据·科技·物联网·算法
奶糖 肥晨1 小时前
一次Spring Boot编译报错排查:三元运算符与包装类型的“隐形陷阱”
java·spring boot·后端