【第八章】 C语言之牛客网&力扣刷题笔记

在这里插入图片描述


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


📗 考点:字符串结束标记的理解和应用

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

char c[5]={'a', 'b', '\0', 'c', '\0'};

printf("%s", c);
  • A:‘a’ ‘b’

  • B:ab \0 c \0

    • C:ab c
  • D: ab

:see_no_evil:大家觉得答案是什么呢


:hear_no_evil:答案是 D 啦~

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

本题的主要考点:"字符串结束标记的理解和应用"

💡本题的解题关键:

  • \0是字符串得结束标记

❗特别注意:

  • 对于字符串来说,只要遇到\0就会结束读取、打印剩余的字符

  • \0ASCII值为0,即0 == ‘\0’,所以对于上面c[2]就相当于是结束标记位置,所以只会打印前面的内容

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


📕考点:数组引用操作符的理解的和应用

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

  • A:a[2][0]

  • B:a[2][3]

  • C:a[0][3]

  • D:a[1>2][1]

:see_no_evil:同学们觉得答案是什么呢


:hear_no_evil:答案是 D 啦~

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

本题主要考点:“数组引用操作符的理解的和应用”

💡本题的解题关键:

  • 理解[ ]操作符

👉相信同学们对于排除法得出正确选项并不难

❓但如何理解D 这个正确选项呢?

  • 相信同学们对[1>2]不太理解:

    • 其实1>2在这里理解为表达式,我们需要先进行判断其表达式真假,利用其返回值【:返回1 :返回0】来确定引用的位置
  • 所以1>2,返回0,即a[0][1],不存在行和列越界

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


📘考点:字符数组初始化的理解和应用

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

  • A: char a[20]="abcdefg";

  • B: char a[]="x+y=5.";

  • C: char a[15];

  • D: char a[10]='5';

:see_no_evil:同学们觉得答案是什么呢


:hear_no_evil:答案是 D 啦~

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

本题主要考点:“字符数组初始化的理解和应用”

💡解题关键:

  • 字符常量不能对数组进行初始化

我们来详看选项:

  • 🔴选项B数组内初始化后为:{'x','+','y','=','5','.' }

  • 🟠选项C数组定义后,因为没有进行初始化,所以内部元素为随机值,但定义是没有错误的

  • 🟡选项D用字符常量初始化,是错误

    • 如果改成char a[10]={'5'};正确

💥特别注意:

  • 建议在定义数组的同时对数组进行初始化【Eg:char a[100] = {0},即将整个字符数组内初始化成\0

  • 以防数组内存在随机值的情况

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


📙考点:变长数组的理解和应用

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

  • 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];

:see_no_evil:同学们觉得答案是什么呢


:hear_no_evil:答案是 AC 啦~

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

本题主要考点:“`变长数组的理解和应用”

💡解题关键:

  • 定义数组的空间大小只能用常量

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

  • 🔴A选项:宏替换,在预处理阶段就会将的内容替换到程序内,所以替换完为char str1[10],str2[12]

  • 🟠B选项:非法定义,一维数组必须定义数组元素个数【即空间大小

  • 🟡C选项:字符'0',转换成十进制为48,所以最终为int num[48];

  • 🟢D选项:数组定义大小不能为 变量

综上:

  • 我们依次判断下来就可发现为什么选AC啦~

📓考点:二维数组解引用的理解和应用

5、 已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】( )

  • A: *(X[i]+j)

  • B: *(X+i)[j]

  • C:*(X+i+j)
  • D:*(*(X+i)+j)

:see_no_evil:同学们觉得答案是什么呢


:hear_no_evil:答案是 BC 啦~

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

本题主要考点:“二维数组解引用的理解和应用”

💡解题关键:

  • 解引用操作符[]等价于*()

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

  • 🔴A选项:*(X[i]+j) == X[i][j],正确

  • 🟠B选项:[]操作符的优先顺序高于*操作符,所以(X+i)先与[j]结合,即*(*(X+j+i)) == *(X[j+i]+0) == X[j+i][0],这样就越界了,错误

  • 🟡C选项:同理*(X+i+j) == X[i+j][0],数据越界,错误

  • 🟢D选项:*(*(X+i)+j) == *(X[i]+j) == X[i][j],正确

综上:

  • 这也是为什么选BC啦~

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


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

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

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

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

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

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

:mag:题目传送门:OJ链接

示例:

输入:abc         输入:aaa

输出:3             输出:1

💡解题关键:

  • 利用字符的本质还是整型,即利用每个字符的ASCII来进行统计

➡️思路: 运用哈希表的思想

  • 1️⃣因为题目规定出现的字符都是ASCII值小于127,所以可以创建一个大小为128(预留\0的位置)的table数组【即每个字符的ASCII对应着数组的下标】,并将其初始化为0

  • 2️⃣遍历字符串,将遇到的每个字符对应的ASCII值作为下标,在table数组中将此位置标记1【意味着这个下标作为ASCII值时所对应的字符已被统计】

  • 3️⃣统计完字符串后,遍历tale数组,将数组内元素大小为非0的位置个数统计出来,便是字符个数

👉实现:

int main()
{
    char arr[501] = {'\0'};
    int table[128] = {0};
    int sum = 0;
    while(scanf("%s",arr) != EOF);
    {
          //1.
        for (int i = 0; i < strlen(arr); ++i)
        {
            //2.
            table[arr[i]]++;
        }

        //3.
        for(int i = 0; i < 128; ++i)
        {
            if(table[i])
            {
                sum++;
            }
        }

        printf("%d",sum);
    }
    return 0;
}

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

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

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

:mag:题目传送门:OJ链接

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

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

特别注意:

  • 一个数组中有一个数字出现次数大于 n/2,说明这个数字出现次数最多

➡️思路: 互拼思路 -- 打擂台

1️⃣创建一个计数器,第 0个字符开始,假设它就是最多的那个数字(即擂台主),存起来并往后遍历数组,与数组中的每个数字进行比较(与剩余的数字进行打擂台)

  • 若相同,则计数器+1【即遇到队友,人数+1

  • 不相同,则计数器-1【即遇到敌人,对擂台主的人数进行消耗-1

2️⃣依据计数器来判断哪个数字为出现次数最多

  • 当计数器为0时,则表示前面的数字互相消耗完,即前面出现的数字都不是出现最多次的,则表示本轮互拼完毕

    • 从下一个数字开始当擂台主,重新与后面数组中的数字进行互拼
  • 当数组遍历完时,若计数器>0,则说明当前的擂台主为出现次数最多的数字

➡️即计数器0的时候,才需要开启下一轮,否则就比较下去

图例:

Eg:在这里插入图片描述

  • 1️⃣第一次进入数组,让第一个数字当擂台主
    在这里插入图片描述
  • 2️⃣往后开始与数字打擂台

在这里插入图片描述
因为擂台主对手不相同,计数器-1,此时计数器为0

  • 3️⃣本轮互拼完毕,开启下一轮:让下一个数字当擂台主
    在这里插入图片描述
  • 4️⃣遇到队友,计数器+1
    在这里插入图片描述
  • 5️⃣全部数字比较完后,擂台主为答案
    在这里插入图片描述

所以出现次数最多的数字为3

👉实现:

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;
}

✨总结

综上,特辑的第八章呐:lollipop:~

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

毕竟,

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

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

:sparkles:如果觉得收获满满,可以点点赞👍支持一下哟~:sparkles:
在这里插入图片描述

全部评论
我一直在牛客刷题的
点赞 回复 分享
发布于 2022-08-27 22:17 陕西

相关推荐

程序员牛肉:你这简历有啥值得拷打的?在牛客你这种简历一抓一大把,也就是个人信息不一样而已。 关键要去找亮点,亮点啊,整个简历都跟流水线生产出来的一样。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务