一、选择题
1、有以下函数,该函数的功能是( )
int fun(char *s) { char *t = s; while(*t++); return(t-s); }
A: 比较两个字符的大小
B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度
D: 将s所指字符串复制到字符串t中
答案解析
正确答案: B
循环在 *t 为 0 时停止,同时 t++ , t 最后会停在字符串结束的 '\0' 之后的一个位置, t 作为尾部指针减去头部指针就是整个字符串占用内存的字节数,包含\0 在内;而 c 答案字符串长度不包括最后的 \0
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
答案解析
正确答案: 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、以下程序运行后的输出结果是( )
#include <stdio.h> int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p = a + 5, *q = NULL; *q = *(p+5); printf("%d %d\n", *p, *q); return 0; }
A: 运行后报错
B: 6 6
C: 6 11
D: 5 10
答案解析
正确答案: A
指针 q 初始化为 NULL ,接着又解引用指针 q ,是错误的,对 NULL 指针是不能解引用的。
4、设有定义 char *p[]={"Shanghai","Beijing","Honkong"}; 则结果为 j 字符的表达式是( )
A: *p[1] +3
B: *(p[1] +3)
C: *(p[3] +1)
D: p[3][1]
答案解析
正确答案: B
B 选项, p 是个 char* 类型的数组, p[1] 拿到字符串 "beijing" 的首地址,再加 3 便是 'j' 的地址,解地址拿到 'j'
5、以下叙述中正确的是( )
A: 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同
B: 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
C: 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;
D: 指针变量之间不能用关系运算符进行比较
答案解析
正确答案: B
A 选项描述不正确,不同类型指针一般不可以直接赋值; C 选项中, p=NULL; 和 p=0; 是等价的; D 选项中,指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的位置关系。B 选项正确
二、编程题
1:LeetCode面试题 16.15. 珠玑妙算
面试题 16.15. 珠玑妙算 - 力扣(LeetCode)
描述
珠玑妙算游戏(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种字符
【答案解析】
遍历两个数组,统计猜中次数和伪猜中次数 猜中次数:若位置相同且颜色字符也相同在猜中次数计数器+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: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
【答案解析】
在数组中拿到一个数字 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; }