★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。
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,选项B正确。
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,选项B正确。
3、以下程序运行后的输出结果是( )
#include
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指针是不能解引用的,选项A正确。
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’,选项B正确。
5、以下叙述中正确的是( )
A: 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同
B: 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
C: 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;
D: 指针变量之间不能用关系运算符进行比较
正确答案:B
答案解析:A 选项描述不正确,不同类型指针一般不可以直接赋值;C选项中,p=NULL;和p=0;是等价的;D选项中,指向同一数组的两
指针变量进行关系运算可表示它们所指数组元素之间的位置关系,选项B正确。
1、珠玑妙算游戏(the game of master mind)的玩法如下。
计算机有4个槽,每个槽放一个球,颜色可能是红色( R )、黄色( Y )、绿色( G )或蓝色( B )。例如,计算
机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你
可能会猜YRGB 。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注
意,“猜中”不能算入“伪猜中”。
给定一种颜色组合solution 和一个猜测guess ,编写一个方法,返回猜中和伪猜中的次数answer ,其中answer[0]
为猜中的次数, answer[1] 为伪猜中的次数。
leetcode【leetcode 题号:面试题 16.15. 珠玑妙算】
示例:
输入: solution="RGBY",guess="GGRR"
输出: [1,1]
解释: 猜中1次,伪猜中1次。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* masterMind(char* solution, char* guess, int* returnSize){
}
int* masterMind(char* solution, char* guess, int* returnSize){
*returnSize=2;
srand((unsigned)time(NULL));
int* arr=(int*)malloc(sizeof(int)*2);
int count1=0,count2=0,i=0,j=0;
for(i=0;i<4;i++)
{
if(solution[i]==guess[i])
count1++;
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(guess[i]==solution[j])
{
count2++;
for(int k=0;k<4;k++)
{
if(solution[k]==guess[i])
{
solution[k]=rand();
guess[i]=rand();
}
}
break;
}
}
}
arr[0]=count1;
arr[1]=count2-count1;
return arr;
}
2、给出一个整型数组 numbers 和一个目标值 target ,请在数组中找出两个加起来等于目标值的数的下标,返回
的下标按升序排列。
牛客网【牛客网题号: NC61 两数之和】
注意:本题只需要找到第一组符合要求的数据下标即可。不需要返回多组
示例:
输入:[3,2,4],6
返回值:[2,3]
说明:因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以输出[2,3]
/* C语言声明定义全局变量请加上static,防止重复定义 */
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
}
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
int* index = (int*)malloc(sizeof(int) * 2);
*returnSize = 2;
for (int i = 0; i < numbersLen - 1; i++) {
if (numbers[i] - 10 > target) { /
continue; // 减去10之后仍比target大,则最终和一定不等于target,故可用continue跳过本轮循环
}
for (int j = i + 1; j < numbersLen; j++) {
if (numbers[i] + numbers[j] == target) {
index[0] = i + 1;
index[1] = j + 1;
return index;
}
}
}
return index;
}
代码思路:开辟元素个数为2的数组,遍历整个数组元素,判断元素是否符合最基本的两数之和可以等于target,如果可以的话,进行下一步判断,用以此元素之后的元素与该处元素进行相加的和的比较,满足题意则i和j就是数组两个元素。(为什么j是从i+1开始呢?因为i是从0开始进行遍历的,当遇到第一个能作为加数的元素时,j就可以从i+1开始遍历,只有当后面都不符合要求的时候,i才会加1,所以当i加到数组中间元素的时候,j根本不需要跟i之前的元素进行相加了,i在到达此时的i之前,已经判定过前面的i不可能跟后面的j进行相加和为target,所以j只需要从i+1开始执行即可。)