请乘理想之马
挥鞭从此起程
路上春色正好
天上太阳正晴
——希望疫情早日结束,所有美好如约而至!
Day03
一、选择题
1、已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; ,正确的调用语句是( )A: fun(c,&d) ;B: fun(c,d) ;C: fun(&c,&d) ;D: fun(&c,d) ;2、请问下列表达式哪些会被编译器禁止【多选】( )int a = 248, b = 4; int const* c = 21; const int* d = &a; int* const e = &b; int const* const f = &a;
A: *c = 32 ;B: *d = 43C: e=&aD: f=0x321f3、以下程序的输出结果为( )![]()
#include <stdio.h> int i; void prt() { for (i = 5; i < 8; i++) printf("%c", '*'); printf("\t"); } int main() { for (i = 5; i <= 8; i++) prt(); return 0; }
A: ***
B: *** *** *** ***
C: *** ***
D: * * *
4、下面代码段的输出是( )![]()
A: -6
B: 12
C: 0
D: -12
5、下列不能实现死循环的是( )A: while(1){}B: for( ; 1 ; ){}C: do{}while(1) ;D: for( ; 0 ; ){}二、编程题
T1:记负均正_牛客题霸_牛客网HJ97 记负均正
描述
首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
0即不是正整数,也不是负数,不计入计算
数据范围:
,输入的整数都满足
输入描述:
本题有多组输入用例。
首先输入一个正整数n,
然后输入n个整数。输出描述:
输出负数的个数,和所有正整数的平均值。
示例1
输入:
5 1 2 3 4 5 10 1 2 3 4 5 6 7 8 9 0输出:
0 3.0 0 5.0示例2
输入:
3 0 0 0输出:
0 0.0T2:旋转数组的最小数字_牛客题霸_牛客网JZ11 旋转数组的最小数字
描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1 \le n \le 100001≤n≤10000,数组中任意元素的值: 0 \le val \le 100000≤val≤10000
要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)
示例1
输入:[3,4,5,1,2]
返回值:1
示例2
输入:[3,100,200,3]
返回值:3
题解:
一、选择题
1 、答案解析:正确答案: A参数 a 是指针,要接收地址, BD 错误。参数 b 可以接收的是 char* ,而 &c 的类型是 char(*)[10] , C 错误2 、答案解析:正确答案: ABCD如果 const 位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量; *c 和 *d 不能变。 如果 const 位于 * 的右侧,则 const 就是修饰指针本身,即指针本身是常量; e 和 f 不能变。3 、答案解析:正确答案: A全局变量 i ,在 main() 中修改为 5 ,第一次在 prt() 中执行循环输出三次 '*' , i 被修改为 8 ,回到 main() 中第二次调用 prt() 时,i<8 为假,循环结束没输出,执行一次 print("\t") ,再次回到主函数后 i++ 变为 9 , i<=8 为假,循环结束 ;4 、答案解析:正确答案: Da+=a-=a*a 等价于 a=a+(a=a-a*a) ,即先计算 a=a-a*a ,所以此时 a 的值为 3-3*3=-6 ,再计算 -6+(-6)=-12 赋值给 a ,所以a 的值为 -12 ,也就是整个表达式的值,所以应选择 D5 、答案解析:正确答案: D只有条件为真时才进行循环, ABC 中 1 为真, D 中 0 为假二、编程题1 、【答案解析】:这道题其实通过 scanf 捕捉数据即可,统计负数个数,以及正数格式,并且在统计正数个数的过程中求取正数总和,最后计算得出平均数即可。需要注意的是所有数字中0 是不统计在内的。#include <stdio.h> int main() { int n; while (~scanf("%d", &n)) { int count1 = 0, count2 = 0, tmp; float sum = 0; for (int i = 0; i < n; i++) { scanf("%d", &tmp); if (tmp < 0) { count1++; //统计负数个数 } else if (tmp > 0) { sum += tmp; //正数求和 count2++; //统计大于0的正数个数,这样是因为题目说明0不算在内 } } printf("%d %.1lf\n", count1, sum / count2); } return 0; }
2、【答案解析】: 暴力破解:遍历数组找出最小值即可 更优思想:采用二分查找,这个题主要分析三种旋转情况 [1, 2, 3, 4, 5],使用中间值与右端进行比较。
1. 中间大于右边 [3, 4, 5, 1, 2],这种情况下,最小数一定在右边;则left = middle + 1
2. 中间等于右边 [1, 0, 1, 1, 1], 这个是[0, 1, 1, 1, 1] 旋转过来的,这时候需要缩小范围 right--;,注意不能是 left++,因为是非降序数组,所以要缩小右边范围,把较小值向右推,符合我们的判断规则。
3. 中间小于右边 [5, 1, 2, 3, 4], 这种情况下,最小数字则在左半边;则right = middle
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen) { if (rotateArrayLen == 0) return 0; int left = 0, right = rotateArrayLen - 1, mid; if (rotateArray[right] > rotateArray[left]) return rotateArray[0]; while (left < right) { mid = left + (right - left) / 2; if (rotateArray[mid] > rotateArray[right]) left = mid + 1; else if (rotateArray[mid] == rotateArray[right]) right--; else right = mid; } return rotateArray[left]; }