C语言基础练习——Day06

目录

选择题

编程题

至少是其他数字两倍的最大数

两个数组的交集


选择题

1、以下叙述中正确的是

  • A 只能在循环体内和switch语句体内使用break语句
  • B 当break出现在循环体中的switch语句体内时,其作用是跳出该switch语句体,并中止循环体的执行
  • C continue语句的作用是:在执行完本次循环体中剩余语句后,中止循环
  • D 在while语句和do-while语句中无法使用continue语句
答案:A
💡

解析:

break语句通常用在循环语句和switch语句中。当break用于switch语句中时,可使程序跳出switch而执行switch以后的语句;当break语句用于do-whileforwhile循环语句中时,可使程序终止循环而执行循环后面的语句,即满足条件时便跳出循环。continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环

2、下列for循环的次数为

for(int i = 0 ; i || i++ < 5;);
  • A 0
  • B 5
  • C 1
  • D 无限
答案:D
💡

解析:

逻辑或运算如果前表达式为真,后表达式不计算,第一次循环时i为0,执行i++,第二次循环时i为1,是个真值,不再执行i++,所以死循环

3、以下描述中正确的是

  • A 由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句
  • B do-while循环由do开始,用while结束,在while(表达式)后面不能写分号
  • C 在do-while循环体中,不一定要有能使while后面表达式的值变为零("假")的操作
  • D do-while循环中,根据情况可以省略while
答案:C
💡

解析:

do-while循环中的循环体通常都是复合语句代码块,A错误,while(表达式)后面要写分号,B错误,while不能省,D错误,而对于C选项来说,当没有使while循环后面表达式的值变为0的操作时,就是死循环

4、设函数fun和实参数组的说明是如下形式,则对函数的调用语句中,正确的是

void fun(char ch,float x[]);
float a[10];
  • A fun("asd" , a[]);
  • B fun('x' , A);
  • C fun('68' , 2.8);
  • D fun(32 , a);
答案:D
💡

解析:

A选项数组传参只需要写数组名就行,a[]时错误的,B选项第二个参数写成了大写,错了。C选项第二个参数是浮点数,但是fun函数的第二参数是数组不匹配,fun函数参数x需要传一个数组或者float *指针,只有D选项的形式是正确的

5、在C语言中,一个函数不写返回值类型,默认的返回类型是

  • A int
  • B char
  • C void
  • D 都不是
答案:A
💡

解析:

在C语言中,一个函数不写返回值类型,默认的返回类型是int,但不提倡这么做

编程题

至少是其他数字两倍的最大数

题目链接:747. 至少是其他数字两倍的最大数 - 力扣(LeetCode)

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。
请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1

思路解析:

本题可以先将数组进行排序,此时最大的数值肯定出现在数组的最后一个元素的位置,倒数第二大的数值一定在数组的倒数第二个位置,如果最大的数值比倒数第二个数的两倍还大或者相等就返回下标,否则按要求返回其他内容

参考代码

/*
 * @lc app=leetcode.cn id=747 lang=c
 *
 * [747] 至少是其他数字两倍的最大数
 */

// @lc code=start
int cmp(const void *p1, const void *p2)
{
    return ((*(int *)p1) - (*(int *)p2));
}

int dominantIndex(int *nums, int numsSize)
{
    int index = 0;
    //遍历数组找到最大值
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] > nums[index])
        {
            index = i;
        }
    }
    qsort(nums, numsSize, sizeof(int), cmp);
    //判断数组最大值是否是第二大数值的两倍大,不是则返回-1
    if (numsSize > 1 && nums[numsSize - 1] < 2 * nums[numsSize - 2])
    {
        return -1;
    }
    else if (numsSize == 1)//当数组中只有一个数值时返回0
    {
        return 0;
    }

    return index;
}
// @lc code=end

两个数组的交集

题目链接:349. 两个数组的交集 - 力扣(LeetCode)

给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

思路解析:

将两个数组进行排序,排序之后通过双指针遍历两个数组,遇到相等的即可认为是出现交集,但是需要注意的是,题目要求输出结果中的每个元素一定是唯一的,所以需要判断当前结果数组中的上一个元素和即将插入的数值是否相等,若相等则不添加,否则添加

参考代码

/*
 * @lc app=leetcode.cn id=349 lang=c
 *
 * [349] 两个数组的交集
 */

// @lc code=start
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(void *a, void *b)
{
    return (*(int *)a) - (*(int *)b);
}

int *intersection(int *nums1, int nums1Size, int *nums2, int nums2Size, int *returnSize)
{
    qsort(nums1, nums1Size, sizeof(int), cmp);
    qsort(nums2, nums2Size, sizeof(int), cmp);
    *returnSize = 0;
    int index1 = 0, index2 = 0;
    int *data = malloc(sizeof(int) * (nums1Size + nums2Size));
    while (index1 < nums1Size && index2 < nums2Size)
    {
        int num1 = nums1[index1], num2 = nums2[index2];
        if (num1 == num2)
        {
            // 保证加入元素的唯一性
            if ((*returnSize) == 0 || num1 != data[(*returnSize) - 1])
            {
                data[(*returnSize)++] = num1;
            }
            // 两个数组出现相同时改变两个指针
            index1++;
            index2++;
        }
        else if (num1 < num2)
        {
            index1++;
        }
        else
        {
            index2++;
        }
    }
    return data;
}
// @lc code=end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

怡晗★

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

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

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

打赏作者

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

抵扣说明:

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

余额充值