做笔试题和平时刷题的不同在于要自定义输入输出,此篇文章总结java中的输入,包括输入链表、二叉树等。
读取输入输出的基本操作如下
int n = scanner.nextInt();//读取整数,适合一行只有一个数字
String s = scanner.nextLine();//读取一行字符串
String[] strs = s.spilt(" ");//将字符串转为字符串数组,以空格为分割
int i = Integer.valueOf(strs[0]);//取字符的值
while(scanner.hasNextLine()){
//有些笔试题不给定输入的行数,需要自己判断输入是否结束
//使用scanner.hasNextLine()可以结束输入(不需要再输入一行回车判断)
//使用scanner.hasNextLine()不能本地调试,但可以在线通过
...
}
这里需要注意,如果nextLine()在nextInt()函数之后,会出现字符串为空的错误。这是因为在执行nextInt()之后敲击了enter回车键,回车符会被nextLine()函数吸收,实际上是执行了nextLine()函数吸收了输入的回车符(并不是没有执行nextLine函数),因此,如果有多行输入数字输入,且每行的数字数量不同,比如第一行输入数组的长度,第二行输入数组的情况,尽量使用 scanner.nextLine()读入字符串再转换为int类型数字。
链表的输入
在O(N)
的时间内读取链表有时也是笔试的考点之一,链表的输入如下:
import java.util.Scanner;
public class Input {
//声明为static,否则不能调用
static class ListNode {
//val声明为public,否则不能赋值
public int val;
public ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
public static void main(String[] args) {
//输入链表
/*
输入 示例1
1 2 3 4 5
2
第一行输入是链表的值
第二行输入是K的值,K是大于或等于1的整数
*/
//1.获取输入信息
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
int k = scanner.nextInt();
String[] strings = string.split(" ");
//2.创建头结点
ListNode head = new ListNode(0);
ListNode tail = head;
//3.将输入的字符串变为链表节点
for (String str : strings) {
ListNode newNode = new ListNode(Integer.valueOf(str));
tail.next = newNode;
tail = tail.next;
}
head = head.next;
}
}
满二叉树的输入
除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树是满二叉树。利用满二叉树的性质建立满二叉树:索引为 j 的节点,其左子节点索引为 2j+1, 其右子节点索引为 2j+2,。
static class TreeNode {
public int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String [] strs=sc.nextLine().split(",");
//题意空树或空结点时是输入None
//判断是否为None,空数也是二叉搜索树
if(strs[0].equals("None")){
System.out.print("True");
System.exit(0);
}
int len = strs.length;
ArrayList<TreeNode> list=new ArrayList<>();
for(int i= 0; i< len;i++){
list.add(new TreeNode(Integer.valueOf(strs[i])));
}
int temp = 0;
while(temp <= (len-2)/2){
if(2*temp +1 < len){
list.get(temp).left = list.get(2 * temp + 1);
}
if(2*temp +2 < len){
list.get(temp).right = list.get(2 * temp + 2);
}
temp++;
}
TreeNode root = list.get(0);
}