C语言暑假学习刷题——Day8

这篇博客主要涵盖了C语言中的字符串结束标记、数组越界访问、字符数组初始化、数组语句定义以及二维数组元素访问等基础知识。通过实例解析了如何正确理解和使用这些概念,同时提供了编程题目的示例,如字符个数统计和多数元素查找,帮助读者巩固理解。
摘要由CSDN通过智能技术生成

目录

选择题

考点一:字符串结束标记

考点二:数组越界访问

考点三:字符数组初始化

考点四:数组语句的定义

考点五:二维数组的元素访问

操作符的优先级

编程题

【牛客网题号: HJ10 字符个数统计】【难度:简单】

【leetcode 题号:169. 多数元素】【难度:简单】


 

选择题

考点一:字符串结束标记

如下程序的运行结果是( )

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,而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开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

对于二维数组行和列都是从0开始的

对于a数组行下标最大是1,列下标最大是2

D选项中1>2表达式的值是0,是正确的,即a[0][1]没有越界

A是行越界,B是行和列都越界,C是列越界

考点三:字符数组初始化

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

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

正确答案:D

注意:字符常量不能给字符型数组初始化

考点四:数组语句的定义

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

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选项:数组定义下角标不能为变量(注: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],*(X[i]+j) == X[i][j]
对于B选项:因为[]的优先级高于*,所以代码相当于**((x+i)+j),X+i+j后就越界了,并不代表X[i][j],所以错误(*(*(X+j+i)) == *(X[j+i]+0) == X[j+i][0]

对于C选项:X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行,就越界了(*(X+i+j) == X[i+j][0]

对于D选项:标准的指针形式访问二位数组的一个元素。*(*(X+i)+j) == *(X[i]+j) == X[i][j]

操作符的优先级

b11834aa5e0d4900915469b0aad6ca4e.png

 

347b02b04bc4481bacb8a92c26761045.png

d7b33f33ffe54708a5eeff4a5f8218b4.png

编程题

【牛客网题号: HJ10 字符个数统计】【难度:简单】

描述

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

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

数据范围:1≤n≤500 

输入描述:

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

输出描述:

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

示例1

输入:abc

输出:3

题目传送门:OJ链接

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[501] = { 0 };//存放字符串
    int table[128] = { 0 };//把字符串对应的ascii码作为下标
    int count = 0;
    while (scanf("%s", &arr) != EOF)
    {
        for (int i = 0; i < strlen(arr); i++)
        {
            table[arr[i]]++;//对应ASCII码次数+1
        }
        for (int j = 0; j < 128; j++)
        {
            if (table[j])
            {
                count++;//不管是几,只要不为0,就是改变过的( a b a  即2 1 0)
            }
        }
        printf("%d", count);
    }
    return 0;
}

【leetcode 题号:169. 多数元素】【难度:简单】

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3
示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2
 

提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109

题目传送门:OJ链接

思路:

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

int majorityElement(int* nums, int numsSize){
    int count = 1;
    int tmp = nums[0];
    for (int i = 1; i <numsSize; i++)
    {
        if (tmp == nums[i])
        {
            count++;//与保存的字符相同则计数+1
        }
        else
        {
            count--;//与保存的字符不同则计数-1
        }
        if (count == 0)
        {
            tmp = nums[i + 1];//计数为0表示有可能保存的字符不是最多的字符,换下一个
        }
    }
    return tmp;
}

 

 

 

 

 

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗小温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值