• 【C语言学习者必会的题目集锦1】巩固基础,稳步提高



    目录

    1.打印空格和星号的规律

    2.别样的多组输入

    3.左旋字符串的多种解法

    方法1:保存前移

    方法2:临时数组

    方法3: 三次反转

    4.数组中出现次数超过一半的数字

    方法1:哈希表法

    方法2:排序中值法

    方法3:消除异值法


    近几年互联网受疫情影响,许多互联网都使用牛客网在线笔试招人

    很多同学因为不熟悉牛客网的环境和使用,最后在线笔试面试中屡屡受挫

    牛客网提供了语言巩固,算法提高等在线OJ题,更有面试真题,大厂内推!

    链接附上点击链接注册牛客网

    1.打印空格和星号的规律

    点我做题:BC65 箭形图案

    1. #include
    2. int main()
    3. {
    4. int n=0;
    5. while(~scanf("%d",&n))
    6. {
    7. //上半部分n+1行
    8. for(int i=1;i<=n+1;i++)
    9. {
    10. //空格
    11. for(int j=1;j<=n+1-i;j++)
    12. {
    13. printf(" ");
    14. }
    15. //星号
    16. for(int j=1;j<=i;j++)
    17. {
    18. printf("*");
    19. }
    20. printf("\n");
    21. }
    22. //下半部分n行
    23. for(int i=1;i<=n;i++)
    24. {
    25. //空格
    26. for(int j=1;j<=i;j++)
    27. {
    28. printf(" ");
    29. }
    30. //星号
    31. for(int j=1;j<=n+1-i;j++)
    32. {
    33. printf("*");
    34. }
    35. printf("\n");
    36. }
    37. }
    38. return 0;
    39. }

    这题的启示:

    可以把两个空格作为一次性输出,只要for循环里的判断条件你好写,怎么样都行!!

     学习到牛客网:原来可以通过鼠标可以查看空格有多少个!!!

    我的做题感悟:

    1. 分为上下两部分,每行就是空格和星号组成也是老生常谈了
    2. 形成自己的风格:for(int i=1;i<=N;i++)这样的题从1开始,然后<=某一个数
    3. 找规律,空格和星号的循环判断条件:越来越多,用i,然后加减某一个数,越来越少,用n-i,然后加减某一个数,这个某一个数可以通过第一个外层循环的i带入来知晓。

    2.别样的多组输入

    点我做题:公务员面试

    1. #include
    2. int main()
    3. {
    4. int score=0;//分数(整数)
    5. int max=0;
    6. int min=100;//最小值先给最大的
    7. int count=0;//计数器,7个一组
    8. int sum=0;//7个整数的和
    9. while(scanf("%d",&score)!=EOF)//一次输入一个
    10. {
    11. if(maxmax=score;
    12. if(min>score) min=score;
    13. sum+=score;
    14. count++;
    15. if(count==7)//7个为一组,够了7个重新初始化
    16. {
    17. printf("%.2lf\n",(sum-min-max)/5.0);//格式输出:换行
    18. max=0;
    19. min=100;
    20. sum=0;
    21. count=0;
    22. }
    23. }
    24. return 0;
    25. }

    这题的提示:

    对于多组输入,且是一组输入多个数据,可能大多数人想到的做法是:对于每一组数据一次性输完

     但是这样即不美观,当数据多了就...

    3.左旋字符串的多种解法

    题目:

    实现一个函数,可以左旋字符串中的k个字符。

    例如:

    ABCD左旋一个字符得到BCDA

    ABCD左旋两个字符得到CDAB

    方法1:保存前移

    1. #include
    2. void LeftRound(char* str, int k)
    3. {
    4. int len = strlen(str);
    5. k = k%len;
    6. for (int i = 0; i < k; i++)
    7. {
    8. char temp = str[0];
    9. for (int i = 1; i <= len - 1; i++)
    10. {
    11. str[i - 1] = str[i];
    12. }
    13. str[len - 1] = temp;
    14. }
    15. }
    16. int main()
    17. {
    18. char str[20] = "hello world";
    19. int k = 0;
    20. scanf("%d", &k);
    21. LeftRound(str, k);
    22. printf("%s\n", str);
    23. return 0;
    24. }

    启发:

    k=k%len;提高效率

    方法2:临时数组

    1. #include
    2. void LeftRound(char* str, int k)
    3. {
    4. int len = strlen(str);
    5. k = k % len;
    6. char* temp = (char*)malloc(sizeof(len + 1));
    7. if (temp == NULL)
    8. {
    9. perror(temp);
    10. return -1;
    11. }
    12. strcpy(temp, str + k);
    13. strncat(temp, str, k);
    14. strcpy(str, temp);
    15. }
    16. int main()
    17. {
    18. char str[20] = "hello world";
    19. int k = 0;
    20. scanf("%d", &k);
    21. LeftRound(str, k);
    22. printf("%s\n", str);
    23. return 0;
    24. }

    方法3: 三次反转

    1. void Rotate(char* str, int left, int right)
    2. {
    3. while (left < right)
    4. {
    5. char temp = str[left];
    6. str[left] = str[right];
    7. str[right] = temp;
    8. left++;
    9. right--;
    10. }
    11. }
    12. void LeftRound(char* str, int k)
    13. {
    14. int len = strlen(str);
    15. k = k % len;
    16. Rotate(str, 0, k - 1);
    17. Rotate(str, k, len - 1);
    18. Rotate(str, 0, len - 1);
    19. }
    20. int main()
    21. {
    22. char str[20] = "hello world";
    23. int k = 0;
    24. scanf("%d", &k);
    25. LeftRound(str, k);
    26. printf("%s\n", str);
    27. return 0;
    28. }

    rotate:旋转
    reverse:反转

    4.数组中出现次数超过一半的数字

    点我做题:NC73 数组中出现次数超过一半的数字

    方法1:哈希表法

    本题涉及到<数组元素,出现次数>之间的对应映射关系,这种方法应该不难想到,把数组元素出现的次数存到一个标记数组map里,然后遍历一遍map标记数组,找到次数>half的元素就行!

    1. int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) {
    2. // write code here
    3. int map[10000]={0};
    4. int half=numbersLen/2;
    5. for(int i=0;i
    6. {
    7. map[numbers[i]]++;
    8. }
    9. for(int i=0;i
    10. {
    11. if(map[numbers[i]]>half)
    12. {
    13. return numbers[i];
    14. }
    15. }
    16. return 0;
    17. }

    时间复杂度:O(n)

    空间复杂度:O(1) 

    方法2:排序中值法

    由于题目给定输入的数组"一定非空",也就是numbersLen>=1,还给定"且保证有解",那么数组中一定存在一个出现次数超过一半的数组元素。

    那么如果我们给数组先进行排序,然后取排完序的数组的中间元素,那一定就是目标值!

    也就是快速排序+返回numbers[mid]的代码,简单!不写!

    有人可能又要问数组元素取numbers[mid]的时候是否要分奇偶,不需要!(因为蓝色标注)

    时间复杂度:O(nLogN)

    空间复杂度:O(1)

    方法3:消除异值法

    只要我们把数组元素不同的两个值给消除掉,因为一定存在一个次数超过数组一半的元素,

    所以最后留下来的那个数组值一定是目标值!

    1. int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) {
    2. if(numbers==NULL) return -1;
    3. int time=1;
    4. int target=numbers[0];
    5. for(int i=1;i
    6. {
    7. if(time==0)
    8. {
    9. target=numbers[i];
    10. time=1;
    11. continue;
    12. }
    13. if(target==numbers[i])
    14. {
    15. time++;
    16. }
    17. else
    18. {
    19. time--;
    20. }
    21. }
    22. return target;
    23. return 0;
    24. }

    题目做的不过瘾,再来几道?牛客网

  • 相关阅读:
    【英语阅读】
    [RK3568 Android11] Binder驱动结构体
    MYSQL:索引与锁表范围简述
    数仓主题域和数据域、雪花模型,星型模型和星座模型
    为DuiLib的Edit控件增加PlaceHolderText
    C++ 继承详解
    新版mmdetection3d将3D bbox绘制到图像
    Python数据分析----Numpy介绍与安装
    Docker 的基本概念和优势
    编译原理实验三、 词法分析实验报告
  • 原文地址:https://blog.csdn.net/qq_64428099/article/details/125852123