描述

题目描述

首先给我们一个数字nn,代表我们接下来有nn个整数,然后我们对这nn个整数进行统记,正数求和最后求取平均值,负数计算个数最后输出

样例描述

首先给定样例输入

5
1 2 3 4 5
10 
1 2 3 4 5 6 7 8 9 0

第一组数据我们有55个数字,然后我们统计,没有负数,然后平均值是3.03.0保留了一位小数

第二组数据我们有1010个数字,然后我们统计,没有复数,然后平均值是5.05.0保留了一位小数

所以我们的样例输出是

0 3.0
0 5.0

图解代码

20220117225625

20220117225700

20220117225728

20220117225810

20220117225836

题解

解法一:C++

解题思路:

首先我们多组输入,然后我们在输入的过程中进行统计出正数的和和个数,负数的个数

代码实现

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n;
    while (cin >> n) {
        int cnt = 0, sum = 0, num = 0;
        // cnt 为负数个数,sum为正数的和,num为正数的个数
        vector<int> a(n);
        // 开辟大小为 n 的数组
        for (auto &it : a) {
            // 边输入边统计
            cin >> it;
            if (it < 0) ++ cnt;
            else if (it > 0) sum += it, ++ num;
        }
        cout << cnt << " " << fixed << setprecision(1) << sum * 1.0 / num << endl;
        // 保留一位小数
    }
}

signed main() {
    solve();
    return 0;
}

时空复杂度分析

时间复杂度: O(n)O(n)

理由如下:我们只进行了一个输入的输入,数组的长度为nn

空间复杂度: O(n)O(n)

理由如下:我们开辟了一个长度为nn的数组

解法二:基于解法一的优化

实现思路:

其实我们发现我们可以不需要开辟一个数组,我们可以每次都是只是输入一个值,然后统计即可,我们可以把时间优化下来

代码实现:

#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, tmp, cnt, sum, num;
//     n代表n个数字,tmp为每次输入的数字,cnt代表我们负数的个数,sum代表正数的和,num代表正数的个数
    while (cin >> n) {
        cnt = sum = num = 0;
//         每次清零
        for (int i = 1; i <= n; i++) {
            cin >> tmp;
            if (tmp < 0) ++ cnt;
            else if (tmp > 0) sum += tmp, ++ num;
        }
        cout << cnt << " " << fixed << setprecision(1) << sum * 1.0 / num << "\n";
    }
}

signed main() {
    solve();
    return 0;
}

时空复杂度分析

时间复杂度: O(n)O(n)

理由如下:我们只进行了一个输入的输入,数组的长度为nn

空间复杂度: O(1)O(1)

理由如下:我们只使用了常数的变量空间