目录
1、已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; ,正确的调用语句是( )
2、请问下列表达式哪些会被编译器禁止【多选】( )
1:记负均正_牛客题霸_牛客网 (nowcoder.com)HJ97 记负均正
输出描述:
2:旋转数组的最小数字_牛客题霸_牛客网JZ11 旋转数组的最小数字
题目
一、选择题
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 = 43
C: e=&a
D: f=0x321f
3、以下程序的输出结果为( )
#include <stdio.h> int i; void prt() { for (i = 5; i < 8; i++) printf("%c", '*'); printf("\t"); } in t main() { for (i = 5; i <= 8; i++) prt(); return 0; }
4、下面代码段的输出是( )
int main() { int a=3; printf("%d\n",(a+=a-=a*a)); return 0; }
A: -6
B: 12
C: 0
D: -12
5、下列不能实现死循环的是( )
A: while(1){} B: for( ; 1 ; ){} C: do{}while(1) ; D: for( ; 0 ; ){}
二、编程题
1:记负均正_牛客题霸_牛客网 (nowcoder.com)HJ97 记负均正
描述
首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
0即不是正整数,也不是负数,不计入计算。如果没有正数,则平均值为0。
数据范围: 1≤n ≤2000 ,输入的整数都满足 ∣val∣≤1000
输入描述:
首先输入一个正整数n,
然后输入n个整数。
输出描述:
输出负数的个数,和所有正整数的平均值。
2:旋转数组的最小数字_牛客题霸_牛客网JZ11 旋转数组的最小数字
描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤n≤10000,数组中任意元素的值: 0≤val≤10000
要求:空间复杂度:O(1) ,时间复杂度: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 、【答案解析】
正确答案: D
a+=a-=a*a 等价于 a=a+(a=a-a*a) ,即先计算 a=a-a*a ,所以此时 a 的值为 3-3*3=-6 ,再计算 -6+(-6)=-12 赋值给 a ,所以a 的值为 -12 ,也就是整个表达式的值,所以应选择 D
5 、【答案解析】
正确答案: D
只有条件为真时才进行循环, ABC 中 1 为真, D 中 0 为假
二、编程题
1 、【答案解析】:
这道题其实通过 scanf 捕捉数据即可,统计负数个数,以及正数格式,并且在统计正数个数的过程中求取正数总和,最后计算得出平均数即可。需要注意的是所有数字中0 是不统计在内的。
#include<stdio.h> #include<stdlib.h> int main() { int n = 0; while (scanf("%d", &n) != EOF) { int i = 0; int sum = 0; float ava = 0.0f; int cnt1 = 0;//记录负数 int cnt2 = 0;//记录除0后的数 int cnt3 = 0;//记录0的个数 int* arr = (int*)malloc(n * sizeof(int)); for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } for (i = 0; i < n; i++) { if (arr[i] < 0) { cnt1++; } else if (arr[i] > 0) { sum += arr[i]; cnt2++; } else { cnt3++; } } if (cnt3 == n) { printf("%d 0.0", cnt1); } else { ava = (double)sum / cnt2; printf("%d %.1f", cnt1, ava); } free(arr); arr = NULL; } 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]; }