选择题:
题一:
1、有以下函数,该函数的功能是( )
int fun(char *s)
{
char *t = s;
while(*t++);
return(t-s);
}
A: 比较两个字符的大小 B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度 D: 将s所指字符串复制到字符串t中
答案解析:
循环在*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
答案解析:
在*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
答案解析:
指针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选项,p是个char*类型的数组,p[1]拿到字符串"beijing"的首地址,再加3便是'j'的地址,解地址拿到'j。
题五:
5、以下叙述中正确的是( )
A: 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同
B: 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
C: 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;
D: 指针变量之间不能用关系运算符进行比较
答案解析:
A 选项描述不正确,不同类型指针一般不可以直接赋值;C选项中,p=NULL;和p=0;是等价的;D选项中,指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的位置关系。B选项正确。
编程题:
题一:珠玑妙算
面试题 16.15. 珠玑妙算 - 力扣(LeetCode)
示例:
输入: solution="RGBY",guess="GGRR"
输出: [1,1]
解释: 猜中1次,伪猜中1次。
提示:
len(solution) = len(guess) = 4
solution
和guess
仅包含"R"
,"G"
,"B"
,"Y"
这4种字符
思路一:
第一步:定义两个数组arr1,arr2记录两数组单词(颜色)的个数,开辟两个int类型大小的tmp,输出的数组元素个数为2;
第二步:遍历数组将相同的记录,不相同的在字母数组颜色中+1;
第三步:遍历一遍字母表数组,满足同时有字母且有相同颜色时,tmp+当前数组元素的最小值;
第四步:返回tmp。
int* masterMind(char* solution, char* guess, int* returnSize) { //记录两数组单词(颜色)的个数 int arr1[26] = {0}; int arr2[26] = {0}; int* tmp = (int*)calloc(2,sizeof(int)); *returnSize = 2; //将相同的记录,不相同的在数组颜色中+1 for(int i = 0; i < 4; i++ ) { if(solution[i] != guess[i]) { arr1[solution[i] - 65] ++; arr2[guess[i] - 65] ++; } else { tmp[0]++; } } for(int i = 0; i < 26; i++ ) { //有相同颜色时,将数量给tmp[1] if(arr1[i] > 0 && arr2[i] > 0) { tmp[1] += arr1[i] > arr2[i] ? arr2[i] : arr1[i]; } } return tmp; }
题二:两数之和
示例1
输入:
[3,2,4],6
返回值:
[2,3]
说明:
因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]
思路一:
双重for循环暴力破解:
第一步:开辟动态内存大小为两个int类型的tmp,输出的数组元素个数为2;
第二步:双重for循环:计算当前数与后面的的数相加是否=target,相同:tmp[0] = i + 1;
tmp[1] = j + 1(+1是因为题目没有0下标位)返回tmp;
第三步:遍历结束都没有符合条件的两个下标,就将返回置NULL。
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) { int* tmp = (int*)malloc(sizeof(int) * 2); *returnSize = 2; //计算当前数与后面的的数相加是否=target for(int i = 0; i < numbersLen; i++ ) { //跳过不符合的数 if(numbers[i] > target) continue; for(int j = i+1; j < numbersLen; j++) { if(numbers[i] + numbers[j] == target) { tmp[0] = i + 1; tmp[1] = j + 1; return tmp; } } } //为空时 *returnSize = 0; return NULL; }
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!