【算法】一篇文章搞定算法的输入输出(Java)
算法是找实习和工作中必然会考察的到的点。平时练习主要是在力扣,但力扣只需要写核心代码而不需要编写全部可运行的程序,输入都作为参数进行传递,长期编写核心代码导致忽略了程序的输入输出。考虑到笔试面试大多采用ACM模式,所有需要对格式化的输入和输出进行练习,这里推荐使用牛客网的OJ输入输出专项训练。
下面给出Java输入输出的示例。Java的输入需要导入 java.util.Scanner 包,而输出则不需要。
1.输入逗号分隔的数组
算法题中经常会遇到数组是用逗号分隔的场景,需要特别注意。
input:
5
11,12,13,14,15output:
11,12,13,14,15
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 1.new一个 Scanner 对象
Scanner sc = new Scanner(System.in);
// 2.整数使用 nextInt();
int n = sc.nextInt();
// 3.nextLine()表示读取一行作为字符串,这里读取 n 后面的换行符
sc.nextLine();
int[] nums = new int[n];
// 4.数组作为一个字符串输入,并按照逗号切分,每个数字以 String 类型存储
// 4.1 扩展:sc.next()也是读取字符串,但是不是以换行分割,而是以空格分割
String[] input = sc.nextLine().split(",");
// 5.String 转 int
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(input[i]);
}
// 6.输出。print()仅输出内容,println输出内容并换行
for (int i = 0; i < n; i++) {
System.out.print(nums[i]);
if (i != n - 1) System.out.print(",");
else System.out.print("\n");
}
}
}
2.格式化输出
在需要指定输出小数位数的时候使用。
output:
111231.56
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
// 方法一:String的format方法(推荐)
double f = 111231.5585;
// 保留 2 位小数(有四舍五入)
System.out.println(String.format("%.2f", f));
// 方法二:DecimalFormat的format方法
double f = 111231.5585;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));
}
}
3.输入数据个数或行数未知的情况
遇到这种情况需要判断输入是否结束。
input:
1 2 3
String1 is aaaaa
String2 is bbbbboutput:
1 2 3
String1 is aaaaa
String2 is bbbbb
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int num = sc.nextInt();
System.out.println(num);
}
sc.nextLine(); // 读取数字后面的换行
while (sc.hasNextLine()) {
String str = sc.nextLine();
System.out.println(str);
}
}
}
4.更快的输入输出
输入数据量大的时候会超时。此时使用 java.io 来处理。
input:
5
11 12 13 14 15output:
5
11 12 13 14 15
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 1.定义输入和输出
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
// 2.读入一个数字,默认读入String,需要转为 int
int n = Integer.parseInt(reader.readLine());
// 3.读入一行,并按空格拆分
String s = reader.readLine();
String[] strs = s.split(" ");
// 4.转为 int 数组
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(strs[i]);
}
// 5.输出空行
writer.newLine();
// 6.输出数字
/*
* BufferedWriter的write(int c)解释为“Writes a single character”
* 所以其实写入的数据类型为char,内存长度只有2个字节,而且是以Unicode编码,所以会出现乱码
* 故需要将输入类型装换为 String 类型
*/
writer.write(Integer.toString(n));
writer.newLine();
for (int i = 0; i < n; i++) {
writer.write(Integer.toString(nums[i]));
if (i < n - 1) writer.write(" ");
else writer.write("\n");
}
// 7.此时才会真正触发输出
writer.flush();
}
}
输入输出十分重要,千万不能忽略。输入都不正确,接下来的处理会更加麻烦。输出不正确,即使算法得到了正确的答案,也不能拿到分数。今天的输入输出就到这里,后面会正式进入编程部分。
点击即可关注公众号。