HJ97 题解 | #记负均正#

题意分析

  • 给一个数组,需要找到这个数组里面的负数的个数和正数的平均数。

思路分析

  • 直接模拟即可。我们遍历这个数组,如果是正数,那么用一个变量sum统计,同时累加个数,如果是负数,那么就只要累加负数,最后即可得到最后的结果。这里求正数的平均数的时候要注意的是除数为0的情况,不然可能出现段错误。

alt

C++

  • 代码如下
    • 需要遍历整个数组,时间复杂度为O(n)O(n)
    • 只用了少数几个变量进行求解,空间复杂度为O(1)O(1)
#include<bits/stdc++.h>

using namespace std;

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        // neg表示的是负数的个数,pos表示正数的个数,sum表示的是正数的和
        int neg=0,sum=0,pos=0;
        while(n--){
            int x;
            scanf("%d",&x);
            if(x<0){
                neg++;
            }else if(x>0){
                sum+=x;
                pos++;
            }
        }
        double ans=0;
        // 这里要特判pos是否为0,避免段错误
        if(pos){
            ans=(double)sum/pos;
        }
        printf("%d %.1lf\n", neg, ans);
    }
    return 0;
}

Python

  • 代码如下
    • 需要遍历整个数组,时间复杂度为O(n)O(n)
    • 只用了少数几个变量进行求解,空间复杂度为O(1)O(1)
while True:
    try:
        n=int(input())
        arr=input().split()
        pos=0
        sum=0
        neg=0
        for i in range(n):
            if int(arr[i])>0:
                pos+=1
                sum+=int(arr[i])
            elif int(arr[i])<0:
                neg+=1
        # 特判除数为0的情况
        if pos==0:
            ans=0.0
        else:
            ans=round(sum/pos,1)
        print(neg, ans)
    except:
        break