一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
题目描述
题目链接:牛客组队竞赛
解题思路:
解题代码:
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);
}
}
做题过程的自我剖析
总的来说,能读懂,有思路,但写不出,原因有下:
- 牛客网的输入输出不熟悉,又或者说对输入输出这一知识点不够了解,并且不会运用,比如说next(),nextInt(),hasNext()等的用法不熟悉。
- 基础语法知识不牢固,要用的时候,脑子成一团浆糊,搅出来的都是浆。
- 字符串的知识点不熟悉,也就是不成体系,学过就忘。
那么本次博客借着回顾这道题来查缺补漏。
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)总结
预备知识
- Windows中的Enter键相当于回车(\r)+换行(\n),分别完成将光标移到行首、移到下一行的功能;
- nextInt():直至读取到空格或回车之后结束本次的int值;
- next():直至读取到空格或回车之后结束本次的String值,不可读取回车;
- 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);
}
}
}
易错点:
- nextInt()或者next()读取完毕并回车之后其后紧跟nextLine(),就会导致nextLine()读取到空值,因为nextLine()自动读取到’\n’,意味着遇到结束符;
- 有时候将字符串转为整数时,代码没问题却提示数组越界,往往是因为字符串代表的整数超过了int的最值,需要改用long。