C语言:选择+编程(每日一练Day8)

傷城~ 2023-10-15 09:10 162阅读 0赞

" class="reference-link">55f0f6eb5fef45b8b31fc561c321cc87.png

目录

选择题:

题一:

题二:

题三:

题四:

题五:

编程题:

题一:字符个数统计

思路一:

题二:多数元素

思路一:

本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!


选择题:

题一:

1、如下程序的运行结果是( )
char c[5]={‘a’, ‘b’, ‘\0’, ‘c’, ‘\0’};
printf(“%s”, c);

A: ‘a’ ‘b’ B: ab\0c\0 C: ab c D: ab

答案解析:

字符串的结束标志是’\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]

答案解析:

本题主要考虑数组越界访问的情况,二维数组的行和列都是从0开始的,对于a数组来说,行下标最大是1,列下标最大是2,D选项中1>2表达式的值是0,是正确的,其他选项行和列都可能存在越界,A是行越界,B是行和列都越界,C是列越界。

题三:

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

A: char a[20]=”abcdefg”; B: char a[]=”x+y=5.”;

C: char a[15]; D: char a[10]=’5’;

答案解析:

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

题四:

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

答案解析:

A选项:宏替换,没问题;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)

答案解析:

本题考查的是二维数组的元素访问,A选项是 正确的,X[i]就是第i行的数组名,数组名表示首元素的地址,X[i]表示第i行的第一个元素的地址,+j后就是第i行下标为j的元素的地址,整体解引用就是X[i][j],A正确。B选项因为[]的优先级高于*,

所以代码相当于**((x+i)+j),X+i+j后就越界了,并不代表X[i][j],所以错误。C选项也明显不对,X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行,就越界了,C错误。D选项是标准的指针形式访问二位数组的一个元素。

编程题:

题一:字符个数统计

字符个数统计_牛客题霸_牛客网 (nowcoder.com)

5a5b69954d704d188dbab0a26cf74b44.png

示例:

输入:

  1. abc

输出:

  1. 3

思路一:

排序记录法:

第一步:创建足够大小的数组arr,输入数组的元素,计算数组长度sz,通过my_string函数传参计算;

第二步:在函数中将数组按升序排序,以及记录数的定义count

第三步:遍历数组:确保唯一性当数组为空或没有记录相同的字符时放入数组,每次记录完记录数都+1;

第四步:将记录数count返回,打印。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <assert.h>
  4. #include <stdlib.h>
  5. //升序排列
  6. int my_cmp(const void* p1,const void* p2)
  7. {
  8. return strcmp((char*)p1,(char*)p2);
  9. }
  10. //计算字符个数函数
  11. int my_string(char* arr,int sz)
  12. {
  13. assert(arr);
  14. //升序排列
  15. qsort(arr,sz,sizeof(arr[0]),my_cmp);
  16. char sum[500]= {0};
  17. int count = 0;
  18. //遍历数组
  19. for(int i = 0;i < sz;i++ )
  20. {
  21. //当数组为空或没有记录相同的字符时放入数组
  22. if(count == 0 || arr[i] != sum[count-1])
  23. {
  24. sum[count++] = arr[i];
  25. }
  26. }
  27. return count;
  28. }
  29. int main()
  30. {
  31. char arr[500] ={0};
  32. scanf("%s",&arr);
  33. //就是数组长度
  34. int sz = strlen(arr);
  35. //记录不同个数
  36. int num = my_string(arr,sz);
  37. printf("%d\n",num);
  38. return 0;
  39. }

题二:多数元素

169. 多数元素 - 力扣(LeetCode)

" class="reference-link">1cf23847450c41588daf4b7655efa4f1.png

思路一:

轮番比较:

第一步:定义记录数count比较数k,题目返回条件

第二步:数组num按升序排列;

第三步:遍历数组:先判断k与上一个k值是否相同不相同则开始下一个数的记录;相同则记录数+1;当满足题目返回条件时退出。

  1. //比较函数升序
  2. int my_cmp(const void* p1,const void* p2)
  3. {
  4. return *(int*)p1 - *(int*)p2;
  5. }
  6. int majorityElement(int* nums, int numsSize)
  7. {
  8. int num = numsSize/2;
  9. int count = 0;
  10. int k = -1;
  11. //升序排序
  12. qsort(nums,numsSize,sizeof(nums[0]),my_cmp);
  13. //遍历数组
  14. for(int i = 0;i < numsSize;i++)
  15. {
  16. //与k不相同就重新开始记录
  17. if(k != nums[i])
  18. {
  19. k = nums[i];
  20. count = 0;
  21. }
  22. //相同记录+1
  23. if(nums[i] == k)
  24. {
  25. count++;
  26. }
  27. //达到要求返回
  28. if(count > num)
  29. {
  30. return k;
  31. }
  32. }
  33. return 0;
  34. }

本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

c90de1178d0345148d109f22b2169307.jpeg

发表评论

表情:
评论列表 (有 0 条评论,162人围观)

还没有评论,来说两句吧...

相关阅读