Bootstrap

华为OD机试 - 记负均正(Python/JS/C/C++ 牛客练习题 HJ105)

在这里插入图片描述

2025华为OD机试题库(按算法分类):2025华为OD统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
0即不是正整数,也不是负数,不计入计算。如果没有正数,则平均值为0。

数据范围: 1≤n ≤2000 ,输入的整数都满足∣val∣≤1000 。

二、输入描述

首先输入一个正整数n,然后输入n个整数。

三、输出描述

输出负数的个数,和所有正整数的平均值。

四、测试用例

测试用例1

1、输入

5
-1 2 3 0 -2

2、输出

2 2.5

3、说明

负数:-1 和 -2,共2个。
正数:2 和 3,平均值 = (2+3)/2 = 2.5。

测试用例2

1、输入

5
-2 0 5 0 0

2、输出

1 5.0

3、说明

负数:-2,共1个。
正数:只有5,平均值 = 5.0。

五、解题思路

  1. 读取输入,将整数个数存储在变量n中;
  2. 初始化负数计数变量countNegative为0,正数计数变量countPositive为0,和变量sum为0;
  3. 使用循环读取n个整数,并进行判断:
    • 如果当前整数小于0,将countNegative加1;
    • 如果当前整数大于0,将其加到sum中,同时将countPositive加1;
  4. 计算正数的平均值average,如果countPositive为0,则平均值为0;
  5. 输出负数的个数countNegative和正数的平均值average,保留一位小数;
  6. 重复步骤2-5,直到没有更多输入;

六、Python算法源码

# 导入sys模块用于读取标准输入
import sys

def main():
    # 读取所有输入数据并以空白字符拆分成列表
    data = sys.stdin.read().strip().split()
    idx = 0  # 用于遍历data列表的索引
    # 当还有数据时循环处理每个测试用例
    while idx < len(data):
        # 读取第一个数字,表示接下来输入的整数个数
        n = int(data[idx])
        idx += 1  # 索引加1
        countNegative = 0  # 统计负数的个数
        countPositive = 0  # 统计正数的个数
        sumPositive = 0    # 累加正数的和
        # 循环读取n个整数
        for i in range(n):
            num = int(data[idx])
            idx += 1  # 更新索引
            if num < 0:
                countNegative += 1  # 如果数字小于0,负数计数加1
            elif num > 0:
                sumPositive += num  # 如果数字大于0,将其加到正数和中
                countPositive += 1  # 正数计数加1
        # 计算正数平均值,若无正数则设为0.0
        average = 0.0 if countPositive == 0 else sumPositive / countPositive
        # 输出负数个数和保留一位小数的平均值
        print(f"{countNegative} {average:.1f}")

# 当模块作为主程序执行时调用main函数
if __name__ == '__main__':
    main()

七、JavaScript算法源码

// 设置标准输入的编码方式
process.stdin.setEncoding('utf-8');

let input = '';  // 用于存储输入数据的字符串
// 当接收到数据块时,将数据块追加到input中
process.stdin.on('data', function(chunk) {
    input += chunk;
});
// 当输入结束后,开始处理数据
process.stdin.on('end', function() {
    // 使用正则表达式以空白字符拆分输入数据,得到所有数字的字符串数组
    let tokens = input.trim().split(/\s+/);
    let idx = 0;  // 初始化索引
    // 循环处理每个测试用例,直到所有输入数据处理完毕
    while (idx < tokens.length) {
        // 读取第一个数字,表示整数个数n
        let n = parseInt(tokens[idx++]);
        let countNegative = 0;  // 用于统计负数的个数
        let countPositive = 0;  // 用于统计正数的个数
        let sumPositive = 0;    // 用于累加正数的和
        // 循环读取n个整数
        for (let i = 0; i < n; i++) {
            let num = parseInt(tokens[idx++]);
            if (num < 0) {
                countNegative++;  // 如果数字小于0,计数加1
            } else if (num > 0) {
                sumPositive += num;  // 数字大于0则累加
                countPositive++;     // 正数计数加1
            }
        }
        // 计算正数平均值,没有正数时平均值为0.0
        let average = countPositive === 0 ? 0.0 : sumPositive / countPositive;
        // 输出结果,使用toFixed(1)保留一位小数
        console.log(countNegative + " " + average.toFixed(1));
    }
});

八、C算法源码

#include <stdio.h>
 
int main(){
    int n;
    // 使用while循环读取每个测试用例,scanf返回EOF时退出循环
    while (scanf("%d", &n) != EOF) {
        int countNegative = 0;  // 统计负数个数
        int countPositive = 0;  // 统计正数个数
        int sumPositive = 0;    // 累加正数的和
        // 循环读取n个整数
        for (int i = 0; i < n; i++){
            int num;
            scanf("%d", &num);  // 读取一个整数
            if (num < 0)
                countNegative++;  // 负数计数加1
            else if (num > 0) {
                sumPositive += num;  // 累加正数
                countPositive++;     // 正数计数加1
            }
        }
        // 计算正数平均值,若无正数则平均值为0.0
        double average = countPositive == 0 ? 0.0 : (double)sumPositive / countPositive;
        // 按照要求格式输出结果:负数个数和保留1位小数的平均值
        printf("%d %.1f\n", countNegative, average);
    }
    return 0;  // 程序结束
}

九、C++算法源码

#include <iostream>   // 引入输入输出流库
#include <iomanip>    // 引入iomanip库,用于格式化输出
using namespace std;
 
int main(){
    int n;
    // 当cin读取到数据时,循环处理每个测试用例
    while(cin >> n){
        int countNegative = 0;  // 统计负数的个数
        int countPositive = 0;  // 统计正数的个数
        int sumPositive = 0;    // 累加正数的和
        // 循环读取n个整数
        for(int i = 0; i < n; i++){
            int num;
            cin >> num;  // 读取一个整数
            if(num < 0)
                countNegative++;  // 如果小于0,负数计数加1
            else if(num > 0){
                sumPositive += num;  // 累加正数
                countPositive++;     // 正数计数加1
            }
        }
        // 计算正数平均值,若没有正数则为0.0
        double average = countPositive == 0 ? 0.0 : (double)sumPositive / countPositive;
        // 设置输出格式:保留1位小数,并输出负数个数和平均值
        cout << countNegative << " " << fixed << setprecision(1) << average << endl;
    }
    return 0;  // 程序正常结束
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述

;