文章目录
day02
一、选择题
1.下面的程序,最终结果是什么?
#include <stdio.h>
void fun(char **p)
{
int i;
for(i = 0; i < 4; i++)
printf("%s", p[i]);
}
in
t main()
{
char *s[6] = {"ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"};
fun(s);
printf("\n");
return 0;
}
A: ABCDEFGHIJKL B: ABCD C: AEIM D: ABCDEFGHIJKLMNOP
解析:
数组下标从0开始,for循环的条件是打印数组中0~3个字符串
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)
解析:
&数组名,这里的数组名表示整个数组,&数组名,取出的是整个数组的地址
假如 int a[3][4] = {{1,2,3,4,}{5,6,7,8}{9,10,11,12}};
这个是二维数组,a[1][1] 第二行第二列 6
A: *(&a[0][0]+5)
&a[0][0]表示取出首元素(第一行第一列)地址 +5表示取出第六个元素地址,往后推刚好是第二行第二列的元素。 *代表的就是取出元素
B: *(*(a+1)+1)
a表示的是二维数组第一行的地址,a+1就是第二行的地址 *(a + 1)表示的是第二行 等价于a[1]
*(a+1)+1 向右偏移1 第二行第二列
C: *(&a[1]+1)
a[1]是第二行的数组名,&a[1]取出的就是第二行的地址,(&a[1] + 1)就是第三行的地址 这里就不对了
D: *(a[1]+1)
与B是等价的
3、 void (*s[5])(int) 表示意思为( )
A: 函数指针 B: 函数指针数组
C: 数组指针函数 D: 语法错误
解析:
函数指针:指向函数的指针
例如int (pf)(int,int) = Add;//pf就是函数指针变量
//函数指针类型 int ()(int,int)
//函数指针数组 存放函数指针的数组
例如: int (* pf[4])(int, int) = { Add, Sub, Mul, Div };
//4可以省略int (* pf[ ])(int, int)
4.在64位系统下,下面程序的返回结果是?
int main()
{
int *k[10][30];
printf("%d\n", sizeof(k));
return 0;
}
A: 4 B: 8 C: 1200 D: 2400
解析:
sizeof(数组名) 计算的是整个数组的大小 所以是 8* 10 *30 = 2400
因为在64位下所以用8,如果是32位下就用4
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);
解析:
根据void f(int p);,f的参数类型是int
f(a).
a 被传入函数形参时, 会退化成指向其首元素的指针, 类型是 int*, 不符. 一维数组 a首元素地址
f(&a).
&a 是数组 a 的地址, 其类型是 int()[4], 不符. &a是取出整个数组的地址
f(b).
b 是数组的数组. b 被传入函数形参时, 会退化成指向其首元素的指针, 也就是 b[0] 的地址, b[0] 的类型是 int[4], 故 &b[0] 类型是 int()[4], 不符. 二维数组 b第一行的地址
f(q)
. q 是一个指针数组, 在初始化时, 用 b[0], b[1], b[2] 初始化了, 此时 b[0], b[1], b[2] 会退化成指向各首元素的指针(int* 类型, 因此类型符合, 可以用它们初始化). q 被传入函数形参时, 退化成指向其首元素的指针, 即 int**. 符合
二、编程题
1、在一个字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1 (需要区分大小写).(从 0开始计数)
数据范围: 0≤n≤10000 ,且字符串只有字母组成。
要求:空间复杂度 O(n) ,时间复杂度 O(n)
示例:输入:“google”
返回值:4
输入:“aa”
返回值:-1
int FirstNotRepeatingChar(char* str ) {
int n = strlen(str);//计算字符串的长度
if(n == 0)//无字符串就返回-1
return -1;
int count[10000] = {0};//定义一个数组,用来存放元素出现的个数
int i;
for(i = 0; i < n; i++)
count[str[i]]++; //记录元素出现次数
for(i = 0; i < n; i++)
{
if(count[str[i]] == 1)//返回只出现一次的元素的下标
return i;
}
return -1;
}
2、实现一个算法,确定一个字符串 s 的所有字符是否全都不同
实例:
输入: s = “leetcode”
输出: false
输入: s = “abc”
输出: true
bool isUnique(char* astr){
char test[128] = { 0 };//定义一个数组用来存放元素出现的次数
int len = strlen(astr);//计算字符串的长度
for (int i = 0; i < len; i++) {
test[astr[i]]++;//记录元素出现的次数
if (test[astr[i]] >1)
{//不止出现一次就返回FALSE
printf("false\r\n");
return false;
}
}
printf("true\r\n");
return true;
}