C语言暑假学习刷题——Day6

目录

选择题

考点一:break与continue的理解

考点二:逻辑运算

考点三:do-while循环

考点四:函数传参

考点五:默认返回的类型

编程题

【leetcode 题号:747. 至少是其他数字两倍的最大数】【难度:简单】

【 leetcode 题号:349. 两个数组的交集】【难度:简单】


 

选择题

考点一:break与continue的理解

以下叙述中正确的是( )

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

正确答案:A

对于break语句:

1.break语句通常用在循环语句和switch语句中,当break用于switch语句中时,可使程序跳出switch而执行switch以后的语句

2.当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句,即满足条件时便跳出循环

对于continue语句:

1.continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环

考点二:逻辑运算

下列for循环的次数为( )

for(int i = 0 ; i || i++ < 5;)

A: 0 B: 5 C: 1 D: 无限

正确答案:D

显而易见:这是逻辑或运算

逻辑或运算最重要的一个知识点:前表达式为真,后表达式不计算

对于第一次循环时i为0时,即i为假,进而执行i++表达式,此时i=1(为真),进入循环体中,执行一次循环

第二次循环时i为1(非0),是个真值,不再执行i++,也就死循环了

考点三:do-while循环

 以下描述中正确的是( )

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

正确答案:C

do-while循环的语法:(循环至少执行一次)

do
{

循环语句;
}while(表达式);

do-while循环中的循环体通常都是复合语句代码块,A错误,while(表达式)后面要写分号,B错误,while不能省,D错误

考点四:函数传参

设函数 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

分析此函数:

函数的第一个参数为:字符类型

函数的第二个参数为:float x[ ]来接收参数,可以转换为float *(x),所以这里需要我们传浮点型数组或者float *指针(地址)即可

A选项数组传参只需要写数组名就行,a[]时错误的

B选项第二个参数写成了大写,错了。

C选项第二个参数是浮点数,但是fun函数的第二参数是数组不匹配,fun函数参数x需要传一个数组或者float *指针

只有D选项的形式是正确的。

考点五:默认返回的类型

 在c语言中,一个函数不写返回值类型,默认的返回类型是 ( )

A、int     B、char   C、void    D、都不是

正确答案:A

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

编程题

【leetcode 题号:747. 至少是其他数字两倍的最大数】【难度:简单】

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。

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

示例 1:

输入:nums = [3,6,1,0]
输出:1
解释:6 是最大的整数,对于数组中的其他整数,6 至少是数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。
示例 2:

输入:nums = [1,2,3,4]
输出:-1
解释:4 没有超过 3 的两倍大,所以返回 -1 。

题目传送门:OJ链接

提示:

1 <= nums.length <= 50

0 <= nums[i] <= 100

nums 中的最大元素是唯一的

思路与算法

遍历数组分别找到数组的最大值 m1和次大值m2。如果m1≥m2×2 成立,则最大值至少是数组其余数字的两倍,此时返回最大值的下标,否则返回 -1。为了返回最大值的下标,我们需要在计算最大值的同时记录最大值的下标。

int dominantIndex(int* nums, int numsSize){
    int a = -1;
    int b = -1;
    int c = 0;
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] > a)
        {
            b = a;
            a = nums[i];//最大值
            c = i;
        }
        else if (nums[i] > b)
        {
            b = nums[i];//次最大值
        }
    }
    return a >= b * 2? c : -1;
}

【 leetcode 题号:349. 两个数组的交集】【难度:简单】

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

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

1 <= nums1.length  ,   nums2.length <= 1000
0 <= nums1[i]  ,   nums2[i] <= 1000

思路:

暴力破解即可,将 nums1 数组中的每一个数字,判断是否存在于 nums2 数组中,通过这种方式找出交集数据,找出
之后判断这个数组是否已经在返回数组中存在,不存在则添加到返回数组中即可。

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{
    static int arr[1000];
    *returnSize = 0;
    int i, j;
    for (i = 0; i < nums1Size; i++) 
    {
        for (j = 0; j < nums2Size; j++) 
        {
            if (nums2[j] == nums1[i]) //判断nums1[i] 是否在nums2数组中
                break;
        } 
        if (j == nums2Size) // nums1中i位置的数据在nums2数组中不存在,则非交集数据
        {
           continue; 
        }
        //只有在另一个数组中存在的数据才能走下来,判断是否已经被添加到返回数组中
        for (j = 0; j < *returnSize; j++) 
        {
            if (nums1[i] == arr[j]) //判断nums1[i] 是否在 arr 这个返回数组中
                break;
        }
        if (j == *returnSize) //不在返回数组中,则添加到返回数组中
        {
                arr[*returnSize] = nums1[i];
                *returnSize += 1;
        }
    }
    return arr;
}

 

 

 

 

 

你可能感兴趣的:(C语言,学习,c语言,leetcode,算法)