【牛客刷题1】组队竞赛

95 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

题目描述

在这里插入图片描述

题目链接:牛客组队竞赛

解题思路:

1. 先将输入的数据进行排序

解题代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long sum = 0;
        int []array = new int[3*n];
        for(int i =0;i<array.length;i++){
            array[i] = scanner.nextInt();
        }
        Arrays.sort(array);
        for(int i=0; i < n ;i++){
            sum += array[array.length - 2*(i+1)];
            
        }
        System.out.println(sum);
    }
}

        做题过程的自我剖析

         总的来说,能读懂,有思路,但写不出,原因有下:

  1. 牛客网的输入输出不熟悉,又或者说对输入输出这一知识点不够了解,并且不会运用,比如说next(),nextInt(),hasNext()等的用法不熟悉。
  2. 基础语法知识不牢固,要用的时候,脑子成一团浆糊,搅出来的都是浆。
  3. 字符串的知识点不熟悉,也就是不成体系,学过就忘。

        那么本次博客借着回顾这道题来查缺补漏。

1.输入输出

        在Java中输出是相对来说比较容易的,用 System.out.println 语句就可以了。然后,输出却麻烦一点,它需要先构造一个Scanner对象,并且与“标准输入流” System.in,相关联。

Scanner in = new Scanner(System.in);

        定义了上面这条语句,就能进行Scanner类的各种方法实现输入操作了

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("What is your name?");
        String str = scanner.nextLine();
    }

在这里插入图片描述
这里用到了nextLine方法是因为在输入行中有可能包含空格。

        那么,如果我们要想读取一个单词(以空白符作为分隔符,) 就调用:

String str = scanner.next();

要想读取一个整数, 就调用 nextlnt 方法

System.out.print("How old are you? ");
int age = in.nextlnt();

        由于Scanner 类定义在java.util 包中。 当使用的类不是定义在基本java.lang 包中时,一定要使用import 指示字将相应的包加载进来。

        所以,我们要在在程序的最开始添加上一行:

import java.util.*;

 
【注意】因为输入是可见的, 所以 Scanner 类不适用于从控制台读取密码。Java SE 6 特别引入了 Console 类实现这个目的。要想读取一个密码, 可以采用下列代码:(这里以后有时间可单独写一篇博客介绍)

Console console = System.console();
String username = console.readLine("User name");
char[] password = console.readPassword("Password:");

在这里插入图片描述

2.关于牛客网上的输入输出

这部分内容,来自以下文章:
牛客网输入输出(Java)总结

预备知识

  1. Windows中的Enter键相当于回车(\r)+换行(\n),分别完成将光标移到行首、移到下一行的功能;
  2. nextInt():直至读取到空格或回车之后结束本次的int值;
  3. next():直至读取到空格或回车之后结束本次的String值,不可读取回车;
  4. nextLine():直至读取到换行符(回车)之后结束本次读取的String,可读取回车(空值)。

 

1、读取连续整数

输入:包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组。

输出:a+b的结果。

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int a=in.nextInt();
            int b=in.nextInt();
            System.out.println(a+b);
        }
    }
}

2、读取有限整数

输入:第一行包括一个数据组数t(1 <= t <= 100),接下来每行包括两个正整数a,b(1 <= a, b <= 10^9)

输出:a+b的结果

public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        while(n > 0){
            int a=in.nextInt();
            int b=in.nextInt();
            System.out.println(a+b);
            n--;
        }
    }

3、每行读取空格隔开的整数

输入:输入数据有多组, 每行表示一组输入数据。每行不定有n个整数,空格隔开。(1 <= n <= 100)。

输出:每组数据输出求和的结果

import java.util.Scanner;
import java.lang.String;
import java.lang.Integer;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            String[] temp=in.nextLine().split(" ");
            int sum=0;
            for(String s:temp)
                sum+=Integer.valueOf(s);
            System.out.println(sum);
        }
    }
}

易错点:

  1. nextInt()或者next()读取完毕并回车之后其后紧跟nextLine(),就会导致nextLine()读取到空值,因为nextLine()自动读取到’\n’,意味着遇到结束符;
  2. 有时候将字符串转为整数时,代码没问题却提示数组越界,往往是因为字符串代表的整数超过了int的最值,需要改用long。