暑期刷题不松懈——C/C++(2)

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;


}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hey pear!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值