今天记录了两个代码和C的几个破碎知识。
第一段代码是基础型的,关于数组。第二段代码是二分的,一开始没通过全部案例,值得再看。
每日代码
1.记负均正
输入一个数组,输出负数的个数,整数的平均值(0都不参与计算)。
记负均正_牛客题霸_牛客网
#include <stdio.h>
int main() {
int n = 0;
scanf("%d",&n);
int* arr = (int*)malloc(sizeof(int) * n);
int count_pos = 0;
int count_neg = 0;
int sum = 0;
for(int i = 0; i < n; i++)
{
scanf("%d",&arr[i]);
if(arr[i] < 0) ++count_neg;
if(arr[i] > 0)
{
sum += arr[i];
++count_pos;
}
}
double ave;
if(count_pos > 0)
{
ave = (double)sum / (double)count_pos;
}
printf("%d %.1f", count_neg,ave);
return 0;
}
- 格式化输出一位小数 %.1f
- 如果两个整型相除赋值给一个浮点数,要进行类型转换(从我的测试结果来看,转换一个即可) 。
2.旋转数组的最小数字
旋转数组的最小数字_牛客题霸_牛客网
int minNumberInRotateArray(int* nums, int numsLen ) {
int left = 0, right = numsLen - 1;
while(left < right){
int mid = (left + right)/2;
if(nums[mid] > nums[right]){
left = mid + 1;
}
else if(nums[mid] == nums[right]){
right--;
}
else {
right = mid;
}
}
return nums[left];
}
二分的知识,因为要olgn的时间复杂度,所以对半找,找到一个数不符合非降序规律就行,如果没有这样的数,那就返回数组第一个元素。我一开始想了一会比较条件,打算把nums[mid]和nums[0]进行比较,如果mid比0处小,就往右找,否则向左找,但是细节考虑不周,26/29的案例通过,[1,0,1,1,1,1]这样的案例无法通过,后来发现left和right的变化都写错了。看了题解之后发现用中值和右值比较也是可以的只要发现非降序就可以改变。遇到相同的值就right--(我现在发现这个去掉重复的方法在我的错误代码里也是可以运用的)嗯,差不多就是这样,下面是我的错误代码
int minNumberInRotateArray(int* nums, int numsLen ) {
int left = 0, right = numsLen - 1;
int mid = 0;
while(left <= right)
{
mid = (left + right)/2;
if(nums[mid] < nums[0])
{
right--;
}
else
{
left++;
}
}
if(nums[mid] < nums[0])
return nums[mid];
else
return nums[0];
}
C语言破碎知识
今日掉坑
以下程序的输出结果为( )
#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: * * *
答案:A
函数不加花括号就只管一行代码,所以每次进入prt函数printf("\t");语句只被执行了一次。
如果函数的定义在函数的调用之后,那么函数调用之前一定要有函数定义,要是函数的调用在函数定义之后,那么可以不用函数声明。
提醒:提醒自己再学一下函数的编译链接的知识。(读者忽略)
-The End-