题解 | #记负均正II#
记负均正II
http://www.nowcoder.com/practice/64f6f222499c4c94b338e588592b6a62
题目的主要信息:
输入 n 个整型数,统计其中的负数个数并求所有非负数的平均值。需要注意的是平均值需要保留到小数点后一位。
方法一:直接计算
用count_n统计负数个数,count_p统计非负数个数。每输入一个数字判断他是否为负数,如果非负数把它累加到sum中,并更新count_p的值,最后sum/count_p即为平均值。输出的时候用printf输出可以精确保留小数。 具体做法:
#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;
}
复杂度分析:
- 时间复杂度:,直接计算无需循环。
- 空间复杂度:,只用了常数空间存储个数和平均值。
方法二:封装函数
用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;
}
复杂度分析:
- 时间复杂度:,需要遍历一遍所有整数。
- 空间复杂度:,最坏情况下所有数都为非负数,positive大小为n。