题目主要信息

1、输入n个整型数,统计其中负数的个数

2、求出非负数的平均值,结果保留一位小数

3、有多组输入数据

方法一:暴力直接求解

具体做法

直接对输入数据一遍记录有多少负数,并把非负数进行存储,并进行求平均值。

alt

Java代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = 0;//记录有多少个负数
        int count1 = 0;//记录有多少个非负
        float sum = 0;//求非负数的和
        while (sc.hasNextInt()){
            int number = sc.nextInt();
            if (number >= 0){
                count1++;
                sum += number;
            }else{
                count++;
            }
        }
        System.out.println(count);
        System.out.printf("%.1f\n", sum/count1*1.0);
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),直接遍历每一个。
  • 空间复杂度:O(1)O(1),只用了常数空间存储个数和平均值。

方法二:借助数组保存

具体方法

将输入的整数存入数组中,并对数组进行计算。

Java代码

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = 0;//记录有多少个负数
        int count1 = 0;//记录有多少个非负
        float sum = 0;//求非负数的和
        ArrayList<Integer> temp = new ArrayList<>();
        while (sc.hasNextInt()){
            int number = sc.nextInt();
            temp.add(number);
        }
        System.out.println(count(temp));
        
        System.out.printf("%.1f\n", sum(temp));
    }
    //计算有多少负数 
    public static int count(ArrayList<Integer> temp){
        int count = 0;//记录有多少小于0的
        for (Integer integer : temp) {
            if(integer < 0){
                count++;
            }
        }
        return count;
    }
    //求平均值
    public static float sum(ArrayList<Integer> temp){
        float sum = 0;
        int count = 0;
        for (Integer integer : temp) {
            if(integer>0){
                sum+=integer;
                count++;
            }
        }
        return (float) (sum*1.0/count*1.0);
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历一遍所有整数。
  • 空间复杂度:O(n)O(n), 一个临时数组temp