数据结构经典测试题2

1.

#include <stdio.h>
void fun(char **p)
{
int i;
for(i = 0; i < 4; i++)
printf("%s", p[i]);
}
int main()
{
char *s[6] = {"ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"};
fun(s);
printf("\n");
return 0;
}

上述代码运行结果是什么呢?

A: ABCDEFGHIJKL B: ABCD C: AEIM D: ABCDEFGHIJKLMNOP

答案为D.

char *s[6]={ "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX" }; 以上语句定义了一个字符指针数组s。首先这是一个数组,这个数组里存储的是字符指针,也就是说s[1], s[2] ...等存储的都 是字符指针,类型是 char*。而数组名是指向第一个元素的常量指针,因此s是指向指针的指针,所以函数fun的形参定义是 char **。fun(s)将指针s的值传递给形参p,所以p = s,因此for(i=0;i<4;i + + )printf("%s",p[i]);中printf("%s",p[i])等价于 printf("% s",s[i])。注意,虽然s[i]中存储的不是字符串,而是char*类型的指针,printf在按照%s形式打印字符串的时候, 看到s[i]中存放的地址,输出s[i]存储的指针指向的字符串。所以最后输出为D

2.

数组 a 的定义为: int a[3][4]; 下面哪个不能表示 a[1][1] ( )

A: *(&a[0][0]+5) B: *(*(a+1)+1) C: *(&a[1]+1) D: *(a[1]+1)

答案为C

在二维数组中a[1]是第一行的数组名,数组名表示首元素的地址,即a[1][0]的地址,所以a[1]+1表示的是a[1][1]的地址,所 以D可以取得正确的值;指针操作*(a+1)与a[1]等价,所以B也可以取得正确的值;二维数组在内存中连续存储,所以A中 a[0][0]的地址加5可以取得正确值;C选项错误,应改为*(&a[1][0]+1),因为a[1]就表示a[1][0]的地址.

3.

void (*s[5])(int) 表示意思为( )

A: 函数指针 B: 函数指针数组 C: 数组指针函数 D: 语法错误

答案为B

这是一个标准的函数指针数组,s先与[5]结合,说明s是一个数组,数组的元素是void (*)(int)类型的函数指针,该指针指向 的函数参数为int,返回值为void

4.

int main()
{
int *k[10][30];
printf("%d\n", sizeof(k));
return 0;
}

在64位操作系统上运行上述代码运行结果是什么呢?

A: 4 B: 8 C: 1200 D: 2400

答案为D

int *k[10][30];表示的是指针数组,一共有10*30=300个元素,在64位系统下,每个指针的长度是8字节,因此总长度为 2400字节 .

5.

void f(int **p);
int a[4]={1,2,3,4};
int b[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *q[3]={b[0],b[1],b[2]};

假设函数原型和变量说明如上,则调用合法的是( )

A: f(a); B: f(b); C: f(q); D: f(&a);

答案为C

A选项,f(a)传参时,a会退化成指向其首元素的地址,类型是 int*,不符。B选项,b是二维数组,传参时会退化成指向其首 元素的指针,也就是b[0]的地址,b[0]的类型是int [4],故&b[0]类型是int(*)[4],不符。D选项,&a是数组a的地址,其类型是 int(*)[4],不符。C选项,q是一个指针数组,在初始化时用b[0]、b[1]、b[2], 此时b[0]、b[1]、b[2]会退化成指向各首元素 的指针(int* 类型,因此类型符合,可以用它们初始化)。q传参时,退化成指向其首元素的指针,即 int**,符合

 

6.、在一个字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1 (需要区分大小写).(从 0 开始计数) 数据范围: 0≤*n*≤10000 ,且字符串只有字母组成。 要求:空间复杂度 O(n) ,时间复杂度 O(n)

int FirstNotRepeatingChar(char* str ) {
// write code here
//小写字母[a, z]-[97,122], 大写字母[A, Z]-[65,90]
char table[128] = {0};//以字符ascii值为下标,存放各个字符出现的次数
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (table[str[i]] < 256)//防止字符出现次数过多,导致溢出截断
table[str[i]] += 1; //以字符ascii值为下标,对应位置次数+1
}
//从第0个字符开始在表中查看对应字符的出现次数,第一个次数为1则找到
for (int j = 0; j < len; j++) {
if (table[str[j]] == 1){
return j;
}
}
return -1;
}
谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c23856

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值