ACM模式刷题问题总结

一、输入输出相关问题

 

1. nextInt()与nextLine()

参考文章:几句话直观理解java中Scanner类的next()、nextLine()、nextInt()

nextInt()和nextLine()连用

 

(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];

 

 

 

 


 

posted @ 2024-03-12 17:18  Avava_Ava  阅读(51)  评论(0编辑  收藏  举报