C语言假期作业 DAY 08

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: C语言假期作业 DAY 08


选择题

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

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 开始的,对于 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


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

答案解析

正确答案: AC

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)


答案解析

正确答案: BC

本题考查的是二维数组的元素访问, 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 选项是标准的指针形式访问二位数组的一个元素。


编程题

1:HJ10 字符个数统计

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


描述

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


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


数据范围: 1 \le n \le 500 \1≤n≤500


输入描述

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


输出描述

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


示例1

输入:abc


输出:3


示例2

输入:aaa


输出:1


【答案解析】

这道题思路比较简单,因为题目圈定出现的字符都是 ascii 值小于 127 的字符,因此只需要定义一个标记数组大小为 127 ,然后将字符作为数组下标在数组中进行标记,若数组中没有标记过表示第一次出现,进行计数,否则表示重复 字符。

示例:查表法, "aca" ,首先把 a 字符 ( ascii 值为 97 ) 作为下标,将标记数组的第 97 位置 1 ,下次如果还有 a 字符 出现,到下标 'a' 或者 97 的位置一看是 1 就表示 a 已经统计过了。


#include <stdio.h> 
int main() 
{ 
  char tmp[501] = {0};
  while(~scanf("%s", tmp)) 
  { 
  char table[128] = {0}, *ptr = tmp;
  int count = 0;
  while(*ptr != '\0') 
  { 
    if (table[*ptr] != 1)
    {                  
    count++;       
    }
    table[*ptr++] = 1;
  }
  printf("%d\n", count);
  }
  return 0;
}


2:LeetCode169. 多数元素

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


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


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


示例 1

输入:[3,2,3]

输出:3


示例 2

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

输出:2


进阶

尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。


【答案解析】

一个数组中有一个数字出现次数大于 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++;
  }
  else
  {            
    count--;
    if (count == 0) tmp = nums[i + 1];
  }
  }


相关文章
|
6月前
|
C语言
[日常]C语言作业详解12_17(题型对应知识点)
[日常]C语言作业详解12_17(题型对应知识点)
55 0
|
6月前
|
算法 程序员 编译器
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
49 0
|
6月前
|
存储 Linux C语言
C语言初阶⑥(操作符详解)编程作业(算数转换)(下)
C语言初阶⑥(操作符详解)编程作业(算数转换)
36 1
|
6月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(下)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
38 1
|
6月前
|
存储 C语言 索引
C语言初阶⑥(操作符详解)编程作业(算数转换)(上)
C语言初阶⑥(操作符详解)编程作业(算数转换)
45 0
|
6月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(上)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
38 0
|
6月前
|
存储 人工智能 搜索推荐
【C语言进阶】 假期测评①
【C语言进阶】 假期测评①
55 2
|
6月前
|
存储 安全 BI
【C语言进阶】假期测评②
【C语言进阶】假期测评②
67 1
|
6月前
|
存储 测试技术 C语言
【C语言进阶】 假期测评③
【C语言进阶】 假期测评③
65 1
|
6月前
|
存储 C语言
C语言进阶---------作业复习
C语言进阶---------作业复习