ACM模式刷题问题总结
一、输入输出相关问题
1. nextInt()与nextLine()
参考文章:几句话直观理解java中Scanner类的next()、nextLine()、nextInt()
(1)Scanner是一个扫描器,对于键盘输入或者文件中的数据,先存到缓存区等待读取,它判断读取结束的标示是:空格,回车,tab 等;
(2)next()和nextInt()方法读取到任意间隔符(如空格和回车)就结束,nextLine()读取到回车结束也就是“\r”,next()返回值为String类型,nextLine()返回值为String类型,nextInt()返回值为Int类型。
注意:nextInt()和nextLine()连用时出现的问题
在使用Java中的Scanner类时,如果在读取输入时同时使用nextlnt 和nextLine)方法,需要注意一个问题,因为nextint()方法只会读取输入中的整数部分,而不会读取换行符,所以在接下来使用nextLine)方法时,会读取到上一个输入中的换行符,导致输入不符合预期。为了解决这个问题,可以在使用nextlnt0方法后,使用一个额外的nextLine()方法来读取换行符,然后再进行下一次输入的读取。
解决办法
使用nextLine()清除一下缓存区例:
Scanner scanner = new Scanner(System.in);
int num = scanner.nextlnt);
// 读取换行
scanner.nextLinel);
String str = scanner.nextLine();
System.out,println(“输入的整数为:”+ num);
System.out.println(“输入的字符串为:”+ str);
2. 浮点数控制输出小数位数
参考文章:Java中控制输出小数位数 的三种写法
// 第一种
DecimalFormat df = new DecimalFormat("#0.00");
float data;
data = sc.nextFloat();
System.out.println(df.format(data));
// 第二种,模仿c语言的输出方式
System.out.printf("%.2f\n", data);
// 第三种
System.out.println(String.format("%.2f", data));
二、BigDecimal精确小数用法
所在包:import java.math.BigDecimal;
参考文章:BigDecimal 详解
①创建:
我们在使用 BigDecimal
时,为了防止精度丢失,推荐使用它的BigDecimal(String val)
构造方法或者 BigDecimal.valueOf(double val)
静态方法来创建对象;;
②加减乘除
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.add(b));// 1.9
System.out.println(a.subtract(b));// 0.1
System.out.println(a.multiply(b));// 0.90
System.out.println(a.divide(b));// 无法除尽,抛出 ArithmeticException 异常
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP));// 1.11
③比较
a.compareTo(b)
: 返回 -1 表示 a
小于 b
,0 表示 a
等于 b
, 1 表示 a
大于 b
。
④保留小数位数
通过 setScale
方法设置保留几位小数以及保留规则。保留规则有挺多种,不需要记,IDEA 会提示。
BigDecimal m = new BigDecimal("1.255433");
BigDecimal n = m.setScale(3,RoundingMode.HALF_DOWN);
System.out.println(n);// 1.255
三、如何在静态main()方法中调用自定义的方法、创建内部类
首先,静态方法中只允许调用外部的静态变量和静态方法,因此要想调用自定义的方法,应当将方法声明为静态static的;
其次,静态方法中不允许使用super和this关键字,因此想要使用内部类的构造方法,应当先创建一个当前静态方法所在的类,然后进一步调用内部类的构造方法,如new Main().new Node(1, 1)
;
public class Practice {
class Node {
int key;
int value;
public Node(){}
public Node(int key, int value) {
this.key = key;
this.value = value;
}
}
public static void main(String[] args) {
// Solution solution = new Solution();
Node node = new Practice().new Node(1, 1);
print(2);
System.out.println(node.key);
System.out.println(node.value);
}
public static void print(int value) {
System.out.println(value);
}
}
四、如何根据输入中成对的数字创建一棵树
①创建内部类TreeNode:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(){}
public TreeNode(int val) {
this.val = val;
}
}
②创建一个TreeNode数组(长度为输入中声明的树节点数),并为从1开始的每个下标创建节点:
Main main = new Main();
int n = in.nextInt();
TreeNode[] nodes = new TreeNode[n + 1];
for (int i = 1; i <= n; i++) {
nodes[i] = main.new TreeNode(i);
}
③根据输入中的成对数字构建各节点之间的边,取nodes[1]为根节点root:
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int a = in.nextInt();
int b = in.nextInt();
if (nodes[a].left == null) {
nodes[a].left = nodes[b];
} else {
nodes[a].right = nodes[b];
}
}
TreeNode root = nodes[1];