C语言题目强化-DAY14


★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录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 <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指针是不能解引用的,选项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的下标为24的下标为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开始执行即可。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一直学不会编程的小徐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值