参数a是指针,要接收地址,BD错误。参数b可以接收的是char*,而&c的类型是char(*)[10],C错误
全局变量i,在main()中修改为5,第一次在prt()中执行循环输出三次'*',i被修改为8,回到main()中第二次调用prt()时,i<8
为假,循环结束没输出,执行一次print("\t"),再次回到主函数后i++变为9,i<=8为假,循环结束;
1、首先输入要输入的整数个数 n ,然后输入 n 个整数。输出为 n 个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
题目来源
#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不算在内
}
}
if(count2 != 0)
printf("%d %.1lf\n", count1, sum / count2);
else
printf("%d %.1lf\n", count1,0.0);
}
return 0;
}
2、有一个长度为 n 的非降序数组,比如 [1,2,3,4,5] ,将它进行旋转,即把一个数组最开始的若干个元素搬到数组
的末尾,变成一个旋转数组,比如变成了 [3,4,5,1,2] ,或者 [4,5,1,2,3] 这样的。请问,给定这样一个旋转数组,求数
组中的最小值。
题目来源
1、利用数组是由非递减排序旋转来的
2、数组可以分为两个有序的子数组。其中,左排序的数组的值大于右排序数组中的值。
3、声明left,right 分别指向数组的左右两端。
4、mid = (left+right) / 2 为二分的中间位置。
5、mid,left,right分为三种情况:
mid > right时, 那么 最小值一定在 [mid+1,right]区间中
mid < right时,那么最小值一定在[left,mid]区间内
mid = right时,无法判断最小值在哪个区间,所以此时只能缩小right的值。
// 不是降序数组(不是从大到小)
// 采用二分查找,这个题主要分析三种旋转情况 [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
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param numsLen int nums数组长度
* @return int整型
*/
int minNumberInRotateArray(int* nums, int numsLen){
// write code here
int left = 0;
int right = numsLen-1;
while(left<right){
int mid = left+(right-left)/2;
if(nums[mid]>nums[right]){
left = mid+1;
}
else if(nums[mid]<nums[right]){
right = mid;
}
else if(nums[mid] == nums[right]){
right--;
}
}
return nums[left];
}