【知识碎片】2024_05_07

 今天记录了两个代码和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;
}
  1. 格式化输出一位小数 %.1f
  2. 如果两个整型相除赋值给一个浮点数,要进行类型转换(从我的测试结果来看,转换一个即可) 。

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-

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王_哈_哈 Jw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值