《C语言假期作业学习笔记》—Day14

请乘理想之马

挥鞭从此起程

路上春色正好

天上太阳正晴 

                                                                       ——希望疫情早日结束,所有美好如约而至!

Day14

一、选择题

1、有以下函数,该函数的功能是( ) 

A: 比较两个字符的大小

B: 计算s所指字符串占用内存字节的个数

C: 计算s所指字符串的长度

D: 将s所指字符串复制到字符串t中

2、若有“ float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; ”,则 *pa 的值是( ) 

A: 1.5

B: 2.5

C: 3.5

D: 4.5

3、以下程序运行后的输出结果是( )

 A: 运行后报错

B: 6 6

C: 6 11

D: 5 10

4、设有定义 char *p[]={"Shanghai","Beijing","Honkong"}; 则结果为 j 字符的表达式是( )

A: *p[1] +3

B: *(p[1] +3)

C: *(p[3] +1)

D: p[3][1]

5、以下叙述中正确的是( )

A: 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同

B: 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息

C: 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;

D: 指针变量之间不能用关系运算符进行比较

二、编程题

T1:LeetCode面试题 16.15. 珠玑妙算

面试题 16.15. 珠玑妙算

珠玑妙算游戏(the game of master mind)的玩法如下。

计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。

给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪猜中的次数answer,其中answer[0]为猜中的次数,answer[1]为伪猜中的次数。

示例:

输入: solution="RGBY",guess="GGRR"
输出: [1,1]
解释: 猜中1次,伪猜中1次。
提示:

len(solution) = len(guess) = 4
solution和guess仅包含"R","G","B","Y"这4种字符

T2:NC61 两数之和

描述

给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。

(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)

数据范围:2\leq len(numbers) \leq 10^52≤len(numbers)≤105,-10 \leq numbers_i \leq 10^9−10≤numbersi​≤109,0 \leq target \leq 10^90≤target≤109

要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)

示例1

输入:[3,2,4],6

返回值:[2,3]

说明:因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]

示例2

输入:[20,70,110,150],90

返回值:[1,2]

说明:20+70=90

题解:

一、选择题

1
答案解析:
正确答案: B
循环在 *t 0 时停止,同时 t++ t 最后会停在字符串结束的 '\0' 之后的一个位置, t 作为尾部指针减去头部指针就是整个字符串占用内存的字节数,包含\0 在内;而 c 答案字符串长度不包括最后的 \0
2
答案解析:
正确答案: B
*pa=a 中指针 pa 指向 a[0] pa++ 返回值仍是操作之前的值; *(pa++) pa 指向的地址的值; *(pa++)*=3 将该值变为原来的3 倍,也就是数组 a 的第一个值为 4.5 ;由于 pa++ 之后 pa 指针移动了 sizeof(float) 个字节,所以 pa 指向 a[1], 所以值为 2.5
3
答案解析:
正确答案: A
指针 q 初始化为 NULL ,接着又解引用指针 q ,是错误的,对 NULL 指针是不能解引用的。
4
答案解析:
正确答案: B
B 选项, p 是个 char* 类型的数组, p[1] 拿到字符串 "beijing" 的首地址,再加 3 便是 'j' 的地址,解地址拿到 'j'
5
答案解析:
正确答案: B
A 选项描述不正确,不同类型指针一般不可以直接赋值; C 选项中, p=NULL; p=0; 是等价的; D 选项中,指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的位置关系。B 选项正确

二、编程题

1、【答案解析】: 遍历两个数组,统计猜中次数和伪猜中次数 猜中次数:若位置相同且颜色字符也相同在猜中次数计数器+1 伪猜中次数:颜色相同,但是在不同位置,这时候只需要除去猜中位置之外,统计两个数组中各个字符出现的数量, 取较小的一方就是每种颜色伪猜中的数量了
int* masterMind(char* solution, char* guess, int* returnSize)
{
	*returnSize = 2;
	static int arr[2] = { 0 };
	arr[0] = 0; arr[1] = 0;//静态空间不会进行二次初始化因此每次重新初始化,可以使用memset函数
	int s_arr[26] = { 0 };//26个字符位 solution 四种颜色数量统计
	int g_arr[26] = { 0 };//26个字符位 guess 四种颜色数量统计
	for (int i = 0; i < 4; i++) 
	{
		if (solution[i] == guess[i]) 
		{
			arr[0] += 1;//位置和颜色完全一致则猜中数量+1
		}
		else 
		{
			//统计同一位置不同颜色的两组颜色数量,伪猜中不需要对应位置相同,只需要有对应数量的颜色就行
			s_arr[solution[i] - 'A'] += 1; //统计solution对应颜色字符出现次数
			g_arr[guess[i] - 'A'] += 1;//统计guess对应颜色字符出现次数
		}
	}
	//在两个颜色数量统计数组中查看颜色数量,取相同位置较小的一方就是为猜中数量
	for (int i = 0; i < 26; i++) {
		arr[1] += s_arr[i] > g_arr[i] ? g_arr[i] : s_arr[i];
	}
	return arr;
}

2、【答案解析】: 在数组中拿到一个数字 num 后,在剩下的数字中查找是否有等于 target - num 的数字即可。

int* twoSum(int* numbers, int numbersLen, int target, int* returnSize) 
{
	*returnSize = 2;
	static ret_arr[2] = { 0 };
	memset(ret_arr, 0x00, sizeof(ret_arr));//静态空间不会二次初始化,因此手动初始化
	for (int i = 0; i < numbersLen; i++) 
	{//从第0个位置开始一个一个数字找
		for (int j = i + 1; j < numbersLen; j++) 
		{//从第一个数字往后的数字中找出另一个数字
		 //与numbers[i]相加等于target的数字找到了则i和j就是对应两个数字下标
			if (numbers[i] + numbers[j] == target)
			{
				ret_arr[0] = i + 1;//题目要求下标从1开始
				ret_arr[1] = j + 1;
				return ret_arr;
			}
		}
	}
	*returnSize = 0;//没有符合的下标则返回数组大小为0;
	return NULL;
}

后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                ——By 作者:新晓·故知

《C语言假期作业学习笔记》之内容采用动态管理即若学习到多解、优解等将会进行更新,敬请读者斧正!

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值