题目的主要信息:

输入 n 个整型数,统计其中的负数个数并求所有非负数的平均值。需要注意的是平均值需要保留到小数点后一位。

方法一:直接计算

用count_n统计负数个数,count_p统计非负数个数。每输入一个数字判断他是否为负数,如果非负数把它累加到sum中,并更新count_p的值,最后sum/count_p即为平均值。输出的时候用printf输出可以精确保留小数。 alt 具体做法:

#include <iostream>
#include <stdio.h>

using namespace std;

int main(){
    int num;
    int count_n=0;//统计负数个数
    int count_p=0;//统计非负数个数
    float sum = 0.0;//非负数之和
    float mean = 0.0;//非负数平均值
    while(cin >> num){
        if(num > 0){//非负数
            count_p++;
            sum += num;
        }
        else if(num < 0){//负数
            count_n++;
        }
    }
    if(count_p > 0){//计算平均值
        mean = sum/count_p;
    }
    cout << count_n << endl;
    printf("%0.1f\n",mean);
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),直接计算无需循环。
  • 空间复杂度:O(1)O(1),只用了常数空间存储个数和平均值。

方法二:封装函数

用nums保存所有输入的数字,函数count_negative统计nums中的负数个数,select_positive从nums中挑出所有非负数。positive中为非负数,只要计算所有元素的和再除以长度即可得到平均值。

具体做法:

#include<bits/stdc++.h>
using namespace std;
int count_negative(vector<int> nums){//统计负数个数
    int count=0;
    for(auto i:nums){
        if(i<0){
            count++;
        }
    }
    return count;
}
vector<int> select_positive(vector<int> nums){//从nums中挑出非负数
    vector<int> res;
    for(auto i:nums){
        if(i>=0){
            res.push_back(i);
        }
    }
    return res;
}


int main() {
    int n;
    vector<int> nums;
    while(cin>>n) {//将输入的整数存储到nums中
        nums.push_back(n);
    }
    int count = count_negative(nums);//count为负数的个数
    cout<<count<<endl;//输出负数的个数
    vector<int> positive=select_positive(nums);//positive中存储为非负的整数
    int len = positive.size();//len为非负整数个数
    float mean=0;//平均值
    if(len>0) {
        mean = accumulate(positive.begin(), positive.end(), 0.0);
        mean /= len;//平均值
    }
    cout<<fixed<<setprecision(1)<<mean<<endl;
    return 0;
}


复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历一遍所有整数。
  • 空间复杂度:O(n)O(n),最坏情况下所有数都为非负数,positive大小为n。