【暑期每日一练】 day6

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 【暑期每日一练】 day6

选择题

(1)

1、以下叙述中正确的是( )

A: 只能在循环体内和switch语句体内使用break语句

B: 当break出现在循环体中的switch语句体内时,其作用是跳出该switch语句体,并中止循环体的执行

C: continue语句的作用是:在执行完本次循环体中剩余语句后,中止循环

D: 在while语句和do-while语句中无法使用continue语句

答案:A

解析

break语句通常用在循环语句和switch语句中。当break用于switch语句中时,可使程序跳出switch而执行switch以后的语句;当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句,即满足条件时便跳出循环。continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。B、C和D三个选项中均有错误。因此A选项正确

(2)

2、下列 for 循环的次数为( )

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

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

答案: D

解析

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

(3)

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错误

(4)

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)

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

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

答案:A

解析

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

 

编程题

题一

描述

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

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

示例

提示

解析

暴力破解:双重循环遍历数组,对每个元素判断是否是其他元素的两倍。或者先遍历一遍找出最大值,然后遍历一遍判断是否是其他数字二倍。

更优思想:一次遍历找出最大的数字和次大的数字,判断最大的数字是否是次大数字2倍即可

代码实现

int dominantIndex(int* nums, int numsSize) {
  if (numsSize == 1) return 0;//特殊情况只有一个元素则特殊处理
  int max, sec, idx;
  //先对最大和次大进行选择赋值,注意max和sec不能随意赋初值,因为有可能你赋予的初值就是最大值
  //因此要使用数组中的数据进行初值赋予。
  if (nums[0] > nums[1]) {
    max = nums[0];
    idx = 0;
    sec = nums[1];
  }
  else {
    max = nums[1];
    idx = 1;
    sec = nums[0];
  } 
  for (int i = 2; i < numsSize; i++) {
    if (nums[i] > max) { //当前元素大于max,则意味着要替换
      sec = max; //先将原先最大的保存到sec中,则他就是次大的
      max = nums[i]; //再将最大的放到max中
      idx = i; //保存max值的下标
    }
    else if (nums[i] > sec) {
      //避免刚好nums[0]就是最大的情况,因为不切换最大而导致次大无法判断情况
      sec = nums[i];
    }
  } if
    (max >= sec * 2) {
    return idx;
  } 
  return - 1;
}

题二

描述

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

示例

提示

解析

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

代码实现

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

总结

关于今日练习讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。

相关文章
|
存储 测试技术 C语言
【暑期每日一练】 Epilogue
【暑期每日一练】 Epilogue
|
编译器 C语言
【暑期每日一练】 day12
【暑期每日一练】 day12
|
存储 人工智能 安全
【暑期每日一练】 day15
【暑期每日一练】 day15
|
Serverless C语言
【暑期每日一练】 day8
【暑期每日一练】 day8
|
C语言
【暑期每日一练】 day11
【暑期每日一练】 day11
|
存储 大数据 Serverless
【暑期每日一练】 day7
【暑期每日一练】 day7
|
存储 人工智能 C语言
【暑期每日一练】 day9
【暑期每日一练】 day9
|
芯片
大学计算机基础-题库刷题-精选(二)
大学计算机基础-题库刷题-精选(二)
72 0