题目的主要信息:

  • 输入n个数字,求其中负数的个数与所有正整数的平均值,结果保留一位小数
  • 0即不是正整数,也不是负数,不计入计算

(本题过于简单,无方法二,用两种语言解决)

语言一:C++

具体做法:

对于输入的nn个数字,判断其是否小于0,如果是负数则统计次数,再判断是否大于0,如果是正数则统计正数出现次数并累加和。

最后输出之前先验证正数出现的次数是否等于0,再取平均值。

alt

#include<iostream>
#include<iomanip>
using namespace std;

int main(){
    int n; //统计输入的总数
    while(cin >> n){
        int val;
        int count1 = 0; //统计负数个数
        int count2 = 0; //统计正数个数
        double sum = 0; // 统计正数和
        for(int i = 0; i < n; i++){
            cin >> val;
            if(val < 0) //遇到负数统计个数
                count1++;
            else if(val > 0){ //遇到正数统计个数且累加和
                count2++;
                sum += val;
            }
        }
        cout << count1 << " ";
        if(count2 == 0) //没正整数
            cout << "0.0" << endl;
        else{
            cout.setf(ios::fixed); //不足位自动补齐
            cout << fixed << setprecision(1) << sum / (double)(count2) << endl; //计算均值
        }
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),一次遍历输入即可
  • 空间复杂度:O(1)O(1),常数级空间

语言二:Python

具体做法:

我们用空格间隔开nn个数字,然后将正负数分别从输入的nn个数字中筛选出来,最后求平均值,以及统计负数数组的个数即可。

while True:
    try:
        n = int(input())
        line = list(map(int, input().split())) #用空格分开数字

        minus = [i for i in line if i < 0] #统计负数
        plus = [i for i in line if i > 0] #统计正数
        avg = round(sum(plus) / len(plus), 1) #求和出总数
        print(len(minus), end=(" "))
        print("%.1f" % avg)
    except:
        break

复杂度分析:

  • 时间复杂度:O(n)O(n),分割数字查找正负数都是O(n)O(n)
  • 空间复杂度:O(n)O(n),辅助数组空间大小最坏为nn