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。
五、解题思路
- 读取输入,将整数个数存储在变量n中;
- 初始化负数计数变量countNegative为0,正数计数变量countPositive为0,和变量sum为0;
- 使用循环读取n个整数,并进行判断:
- 如果当前整数小于0,将countNegative加1;
- 如果当前整数大于0,将其加到sum中,同时将countPositive加1;
- 计算正数的平均值average,如果countPositive为0,则平均值为0;
- 输出负数的个数countNegative和正数的平均值average,保留一位小数;
- 重复步骤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算法的适用场景,发现新题目,随时更新。