第三章 C语言之牛客网刷题笔记

💕全网最火特辑💕 第三章 C语言之牛客网刷题📖笔记 【✨点进来保证让知识充实你一整天】

在这里插入图片描述

🌐为大家推荐一款刷题网站呀👉点击跳转
以下题目&算法思想,都可以从此网站中找到并参考学习哟~


前言

同学们,新的学期早已开始啦:kissing_closed_eyes:~相信大家都想在这学期偷偷地卷”死“同学吧:innocent:大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!:fist:

星光不负赶路人,时光不有心人

只要我们以深深地谦卑去忍耐 “暗无天日” 的日子,定会迎来属于我们豁然开朗地一刻!让我们一起为心中所想,去奋斗吧!!

以下内容干货满满,跟上步伐吧~


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


📗 考点:函数的调用的理解和应用

1、已知函数的原型是: int fun(char b[10], int *a)设定义: char c[10]; int d; 正确的调用语句是()

  • A: fun(c,&d); B:fun(c,d); C: fun(&c,&d); D: fun(&c,d);

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


:hear_no_evil:答案是 A 啦~

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

本题的主要考点:"函数的调用"

本题的解题关键:

  • 清楚的明白如何给函数传参函数的调用

题干已给出函数的声明,此声明已给出此函数的所需的两个条件:

  1. 函数的返回类型:int
  2. 函数有两个参数:字符数组的地址;整形地址

特别注意:

  • char b[10]本质上接收的是字符地址
  • 之所以拿int *a接受,是因为形参传递的是一个整型地址

有了以上了解后,题目便迎刃而解啦~

char c[10]的数组名c就代表着字符数组的首元素地址,即字符指针,所以可以直接传数组名给函数

int d便可以&d从而获得这个整型的地址,那函数便也可以拿整型指针接收

所以同学们只要分析好函数声明的部分,便可以很好的完成本题~


📕考点:const对指针的理解和应用

2、请问下列表达式哪些会被编译器禁止【多选】()

int a = 248, b = 4;

int const *c = 21;

const int *d = &a;

int *const e = &b;

int const * const f = &a;

A: *c = 32; B:*d = 43 C:e=&a D:f=0x321f

同学们做这道题可十分经典哦❗

  • 这题目可曾经在华为面试题中出现过

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


    :hear_no_evil:答案是 ABCD 啦~

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

本题主要考点:“const对指针的理解和应用”

在解题前,让我们先了解了解const对指针的作用是什么❓

1️⃣const如果在指针变量的 *的左边【即 const int * a == int const * a】:

➡️表达的意思是: 对指针变量a 解引用的值是保持不变的

  • ==只有a里面存放的地址改变了,解引用出来的值才会变化==

2️⃣const如果在指针变量的 “ * ” 的右边【即 int * const a】

➡️ 表达的意思是: a里面存放的地址是保持不变

  • ==只有主动对 *a 赋值才能改变这个值,但a里面的地址是一直保持不变的==

经过以上了解后,我们再看回题目:

  • 如果 const 位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量

所以上题中的:*c*d 不能变

  • 如果 const 位于 * 的右侧,则 const 就是修饰指针本身,即指针本身是常量

所以上题中的: ef的地址不能被改变

综上:A选项想改变*c的值就错了,B选项同理;ef的地址不能被改变,所以C选项和D选项都错啦~

这类题型是不是很可爱呢:kissing_closed_eyes:~

💡不太理解的同学可以反复理解,这类题型值得我们这么做👈


📘考点:全局变量与转义字符的理解和应用

3、以下程序的输出结果为( )

#include <stdio.h>

int i;

void prt()
{
    for (i = 5; i < 8; i++)
        printf("%c", '*');

    printf("\t");
} 

int main()
{

    for (i = 5; i <= 8; i++)
        prt();

    return 0;
}

A: *** B: *** *** *** *** C: *** *** D: * * *

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


:hear_no_evil:答案是 A 啦~

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

本题主要考点:“全局变量与转义符的理解和应用”

特别注意:

  • 这题出现了\t转义字符

  • 且创建了一个全局变量

    👉\t水平制表符,简单来说就是在键盘上按了TAB的效果,也可以理解为缩进符

👉全局变量创建在静态区中,作用域为整个程序生命周期与主函数相同,只有程序结束,它才会销毁

本题我们只需要稍加画图理解便可得出答案:
在这里插入图片描述

📙考点:运算符优先级和结合性的理解和应用

4、下面代码段的输出是( )

int main()
{
    int a=3;

    printf("%d\n",(a+=a-=a*a));

    return 0;
}

A: -6 B:12 C:0 D:-12

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


:hear_no_evil:答案是 D 啦~

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

本题主要考点:“`运算符优先级和结合性的理解和应用”

特别注意:本题考查的是运算符的优先级和结合性
在这里插入图片描述

💡不难发现:

  • 它们的求值的优先顺序是相同的,而结合性都是从右向左

➡️我们便可得:a+=a-=a*a 得计算可分为两步:

1️⃣a-=a*a = a = a - (a*a) = -6

2️⃣a+=a = a = a + a = -6 + (-6) = -12

✨所以答案为:D


📓考点:循环判断条件的理解和应用

5、下列不能实现死循环的是( )

A: while(1){ } B:for(;1;){ } C:do{}while(1); D:for(;0;){ }

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


:hear_no_evil:答案是 D 啦~

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

本题主要考点:“循环判断条件的理解和应用”

注意:

  • 只有条件为时才进行循环

💡即:非0(包括正负数)、有0

综上:A、B、C选项中循环判断条件为1,D选项中循环判断条件0


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


🏷️【牛客网题号:HJ97 记负均正】【难度:简单】

1、首先输入要输入的整数个数 n ,然后输入n个整数。输出为 n 个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。

  • 输入描述:首先输入一个正整数 n ,然后输入n 个整数

  • 输出描述:输出负数的个数,和所有正整数的平均值

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

示例:
    输入: 5
           1 2 3 4 5
           10    
           1 2 3 4 5 6 7 8 9 0

    输出:    0 3.0
             0 5.0

💡解题关键:

  • 这道题其实通过 scanf 捕捉数据即可,统计负数个数,以及正数格式,并且在统计正数个数的过程中求取正数总和,最后计算得出平均数即可

  • 需要注意的是所有数字中0是不统计在内的

👉实现:

#include <stdio.h>

int main()
{

    int n = 0;
    while(scanf("%d",&n) != EOF)
    {
        int arr[2000] = {0};

        int i = 0;
        int count = 0;
        double val = 0;
        int sum = 0;
        int b = 0;

        for(i=0;i<n;i++)
        {
            scanf("%d",&arr[i]);

            if(arr[i] > 0)
            {
                sum = sum + arr[i];
                b++;
            }

            if(arr[i]<0)
            {
                count++;
            }
        }

        val = sum/(b*1.0);
        printf("%d %.1lf\n",count,val);
    }


    return 0;

🏷️【牛客网题号:JZ11 旋转数组的最小数字】【难度:简单】

2、有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值

  • 数据范围:1≤ n ≤ 10000
  • 数组中任意元素的值: 0 ≤ val ≤ 10000

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

示例:
    输入:[3,4,5,1,2]
    返回值:1

💡解题关键:

  • 暴力破解:遍历数组找出最小值即可

👉实现:

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) 
{
    int min = *rotateArray;
    int i = 0;
    for(i=0;i<rotateArrayLen-1;i++)
    {
        rotateArray = rotateArray + 1;
        if(min > *rotateArray)
        {
            min = *rotateArray;
        }
    }
    return min;
}

✨这题还有更优解

  • 采用二分查找的思想

❗二分查找算法不限于运用在有序数组上。如果能够明确二分之后,答案存在于二分的某一侧,就可以使用二分❗

📖:这个题主要分析三种旋转情况 [1, 2, 3, 4, 5],使用中间值与右端进行比较

  • 之所以选择右端点来比较,是因为原始数组是非递减(即一开始数据大的总是在右端),若中间>右边,则恒有左端点至中间>=右端点

1️⃣[3, 4, 5, 1, 2] 中间大于右端:恒有左端点至中间>=右端点,则确定答案为 [mid+1...last]区间

2️⃣[5 1 2 3 4] 中间小于右端:说明答案肯定不在[mid+1...last],但是arr[mid] 有可能是答案,所以答案在[first, mid]区间

3️⃣[1 0 1 1 1] 中间等于右端:这时候需要缩小范围 right--;注意不能是left++,因为是非降序数组,所以要缩小右边范围,把较小值向右推,符合我们的判断规则

👉实现:

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
    if (rotateArrayLen == 0) 
        return 0;

    int left = 0, right = rotateArrayLen - 1, mid;

    if (rotateArray[right] > rotateArray[left]) 
        return rotateArray[0];

    while(left < right) {
        mid = left + (right - left) / 2;
        if (rotateArray[mid] > rotateArray[right]) left=mid+1;
        else if (rotateArray[mid] == rotateArray[right]) right--;
        else right = mid;
                        } 

    return rotateArray[left];
}

🌐 如何高效学习数据结构与算法?


<kbd>数据结构与算法</kbd>的学习还是得基础知识自己动手同步进行

如果是初学者,需要找一个可以在线练习得网站,我建议你去牛客网多练习呀(快点击跳转学起来吧!)

在这里插入图片描述

就如上述讲解的面试OJ题,牛客网内还有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,看看别人的思路,别人的代码,也许就能豁然开朗~


总结

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

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

毕竟,

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

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

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

全部评论
最近也是狂刷题的状态,希望能有用
点赞 回复 分享
发布于 2022-08-24 09:05 江苏

相关推荐

点赞 评论 收藏
分享
07-01 13:37
门头沟学院 Java
steelhead:不是你的问题,这是社会的问题。
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

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