06ACM输入输出

参考: 面试 | Java 算法的 ACM 模式

数字

  • 如果是读取 Long,则使用:in.hasNextLong()Long a = in.nextLong()
  • 读取小数:f = scan.nextFloat()double weight = scan.nextDouble()

A.多组空格分隔的两个正整数

介绍

无限输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组;

1 5
10 20

代码

import java.util.Scanner;

public class Main {
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()) {
            int a = in.nextInt();
            int b = in.nextInt();
            int ans = func(a, b);
            System.out.println(ans);
        }
    }
    private static int func(int a, int b) {
        return a+b;
    }
    public static void main(String[] args) {
        inOut();
    }
}

B.第一行组数接空格分隔的两个正整数

介绍

第一行输入数据个数,后面输入数据;

2
1 5
10 20

代码

import java.util.Scanner;

public class Main{
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        for(int i = 0; i < n; i++){
            int a = in.nextInt();
            int b = in.nextInt();
            int ans = func(a, b);
            System.out.println(ans);
        }
    }
     private static int func(int a, int b) {
        return a+b;
    }
    public static void main(String[] args) {
        inOut();
    }
}

C.空格分隔的两个正整数为0 0 结束

介绍

输入包括两个正整数a,b(1 <= a, b <= 10^9), 如果输入为0 0则结束输入;

1 5
10 20
0 0

代码

import java.util.Scanner;

public class Main {
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()) {
            int a = in.nextInt();
            int b = in.nextInt();
            if(a == 0 && b == 0) break;
            int ans = func(a, b);
            System.out.println(ans);
        }
    }
    private static int func(int a, int b) {
        return a+b;
    }
    public static void main(String[] args) {
        inOut();
    }
}

D,多组数据, 每组第一个整数为组的大小, 组大小为0是结束

介绍

链接:https://ac.nowcoder.com/acm/contest/5657/D
来源:牛客网

输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。

4 1 2 3 4
5 1 2 3 4 5
0

代码

import java.util.Scanner;

public class Main{
    public static void inOut() {
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()) {
            int n = in.nextInt();
            if(n == 0) break;
            int[] nums = new int[n];
            for(int i = 0; i < n; i++) {
                nums[i] = in.nextInt();
            }
            int ans = func(nums);
            System.out.println(ans);
        }
    }
    public static int func(int[] nums) {
        int sum = 0;
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        return sum;
    }
    public static void main(String[] args) {
        inOut();
    }
}

E 第一行为组数, 每组第一个数为组内大小

介绍

链接:https://ac.nowcoder.com/acm/contest/5657/E
来源:牛客网

输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

2
4 1 2 3 4
5 1 2 3 4 5

代码

import java.util.Scanner;

public class Main {
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        int count = in.nextInt();
        for(int i = 0; i < count; i++) {
            int n = in.nextInt();
            int[] nums = new int[n];
            for(int j = 0; j < n; j++) {
                nums[j] = in.nextInt();            //思想, 这里的下标为j
            }
            int ans = func(nums);
            System.out.println(ans);
        }
    }
    private static int func(int[] nums) {
        int sum = 0;
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        return sum;
    }
    public static void main(String[] args) {
        inOut();
    }
}

F 数行, 每行第一个数为组内大小

介绍

链接:https://ac.nowcoder.com/acm/contest/5657/F
来源:牛客网

输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

4 1 2 3 4
5 1 2 3 4 5

代码

import java.util.Scanner;

public class Main {
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        
        while(in.hasNextInt()) {
            int n = in.nextInt();
            int[] nums = new int[n];
            for(int i = 0; i < n; i++) {
                nums[i] = in.nextInt();
            }
            int ans = func(nums);
            System.out.println(ans);
        }
    }
    private static int func(int[] nums) {
        int sum = 0;
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        return sum;
    }
    public static void main(String[] args) {
        inOut();
    }
}

G 数行, 每行有若干个整数

介绍

链接:https://ac.nowcoder.com/acm/contest/5657/G
来源:牛客网

输入数据有多组, 每行表示一组输入数据。

每行不定有n个整数,空格隔开。(1 <= n <= 100)。

1 2 3
4 5
0 0 0 0 0

代码


import java.util.Scanner;

public class Main {
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            String[] numsStrArr = in.nextLine().split(" ");
            int n = numsStrArr.length;
            int[] nums = new int[n];
            for(int i = 0; i < n; i++) {
                nums[i] = Integer.valueOf(numsStrArr[i]);
            }
            int ans = func(nums);
            System.out.println(ans);
        }
        
    }
    private static int func(int[] nums) {
        int sum = 0;
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        return sum;
    }
    public static void main(String[] args) {
        inOut();
    }
}

字符串

比较项 next( ) nextLine( )
说明 只能读取到空格之前的字符串 可以读取空格的字符串
比如“你好 java” “你好” “你好 java”
使用前判断 in.hasNext() in.hasNextLine()

A.首行为字符个数, 第二行为空格分隔的字符:s

介绍

输入有两行,第一行n

第二行是n个字符串,字符串之间用空格隔开
5
c d a bb e

代码

import java.util.*;

public class Main {
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String[] data = new String[n];
        for(int i = 0; i < n; i++) {
            data[i] = in.next();
        }
        String ans = func(data);
        System.out.print(ans);
    }
    private static String func(String[] data) {
        Arrays.sort(data);
        String ans = "";
        for(int i = 0; i < data.length; i++) {
            if(i == data.length-1) ans += data[i];
            else ans += data[i] + " ";
        }
        return ans;
    }
    public static void main(String[] args) {
        inOut();
    }
}

B. 若干行用空格分隔的字符

介绍

多个测试用例,每个测试用例一行。

每行通过空格隔开,有n个字符,n<100
a c bb
f dddd
nowcoder

代码

import java.util.Scanner;

public class Main {
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        while(in.hasNextLine()) {
            String[] data = in.nextLine().split(" ");
            String ans = func(data);
            System.out.println(ans);            
        }
    }
    private static String func(String[] data) {
        return "";
    }
    public static void main(String[] args) {
        inOut();
    }
}

C. 若干行用逗号分隔的字符

介绍

多个测试用例,每个测试用例一行。
每行通过,隔开,有n个字符,n<100
a,c,bb
f,dddd
nowcoder

代码

import java.util.Scanner;

public class Main {
    private static void inOut() {
        Scanner in = new Scanner(System.in);
        while(in.hasNextLine()) {
            String[] data = in.nextLine().split(",");
            String ans = func(data);
            System.out.println(ans);            
        }
    }
    private static String func(String[] data) {
        return "";
    }
    public static void main(String[] args) {
        inOut();
    }
}

链表

A. 构造一个链表

介绍

输入的是链表的头结点

代码

import java.util.Scanner;

public class Main {
    static class ListNode{
        int val;
        ListNode next;
        ListNode(int val) {
            this.val = val;
        }
    }
    private static void inOut() {
        //构造
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] data = new int[n];
        for(int i = 0; i < n; i++) {
            data[i] = in.nextInt();
        }
        ListNode head = n == 0 ? null : new ListNode(data[0]);
        ListNode p = head;
        for(int i = 1; i < n; i++) {
            p.next = new ListNode(data[i]);
            p = p.next;
        }        
        
        //调用
        ListNode ans = func(head);                
        
        //输出
        while(ans != null) {
            System.out.println(ans.val);
            ans = ans.next;
        }
        
    }
    private static ListNode func(ListNode head) {
        return head;
    }
    public static void main(String[] args) {
        inOut();
    }
}

有null的空字符串构造树

代码
import java.util.Scanner;
import java.util.*;

public class Main {
    static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }
    
    public static String serialize(TreeNode root) {
        return serializeHelp(root, "");
    }
    private static String serializeHelp(TreeNode root, String str) {
        if(root == null) {
            return str+"null,";
        }
        String temp = str + root.val+",";
        String temp2 = serializeHelp(root.left, temp);
        String temp3 = serializeHelp(root.right, temp2);
        return temp3;
    }

    // Decodes your encoded data to tree.
    public static TreeNode deserialize(String data) {
        String[] dataArr = data.split(",");
        Queue<String> que =  new LinkedList<>();
        for(String item : dataArr) {
            que.offer(item);
        }
        return deserializeHelp(que);
    }

    private static TreeNode deserializeHelp(Queue<String> que) {
        String val = que.poll();
        if(val.equals("null") ) {    //其实当que的长度恰好构建出一棵树, 前面的null判断就不会被用到
            return null;
        }
        TreeNode root = new TreeNode(Integer.valueOf(val));
        root.left = deserializeHelp(que);
        root.right = deserializeHelp(que);
        return root;
    }
    
    private static void inOut() {
        Scanner in = new Scanner(System.in);

    }
    private static void func() {

    }
    public static void main(String[] args) {
        inOut();
    }
}

输出格式化

  • 输出有两种方式:String str=String.format(示例) 或 **System.out.printf(示例)**;
  • 向上取整用:**Math.ceil(1.01),向下取整用:Math.floor(1.01)**;

转换符

转换符 说明 示例 输出
%s 字符串 “Hi,%s:%s.%s”, “王南”,“王力”,“王张” Hi,王南:王力.王张
%c 字符 “字母a的大写是:%c %n”, ‘A’ 字母a的大写是:A
%b 布尔 “3>7的结果是:%b %n”, 3>7 3>7的结果是:false
%d 整数(十进制) “100的一半是:%d %n”, 100/2 100的一半是:50
%x 整数(十六进制) “100的16进制数是:%x %n”, 100 100的16进制数是:64
%o 整数(八进制) “100的8进制数是:%o %n”, 100 100的8进制数是:144
%f 浮点 “50元的书打8.5折扣是:%f 元%n”, 50*0.85 50元的书打8.5折扣是:42.500000 元
%a 浮点(十六进制) “上面价格的16进制数是:%a %n”, 50*0.85 上面价格的16进制数是:0x1.54p5
%e 指数 “上面价格的指数表示:%e %n”, 50*0.85 上面价格的指数表示:4.250000e+01
%g 通用浮点(f和e类型中较短的) “上面价格的指数和浮点数结果的长度较短的是:%g %n”, 50*0.85 上面价格的指数和浮点数结果的长度较短的是:42.5000
%h 散列码 “字母A的散列码是:%h %n”, ‘A’ 字母A的散列码是:41
%% 百分比 “上面的折扣是%d%% %n”, 85 上面的折扣是85%
%n 换行符
%tx 日期与时间

3.2 搭配转换符的标志

标志 说明 示例 输出
. 后接保留多少位小数(四舍五入) (“%.2f”,3.555) 3.56
+ 为正数或者负数添加符号 (“%+d”,15) +15
左对齐 (“%-5d”,15) |15 |
0 数字前面补0 (“%04d”, 99) 0099
空格 在整数之前添加指定数量的空格 (“% 4d”, 99) | 99|
, 以“,”对数字分组 (“%,f”, 9999.99) 9,999.990000
( 使用括号包含负数 (“%(f”, -99.99) (99.990000)
# 如果是浮点数则包含小数点,如果是16进制或8进制则添加0x或0 (“%#x”, 99) (“%#o”, 99) 0x63 0143
< 格式化前一个转换符所描述的参数 (“%f和<3.2f”, 99.45) 99.450000和99.45
$ 被格式化的参数索引 (“%1$d,%2$s”, 99,“abc”) 99,abc

欢迎在评论区中进行批评指正,转载请注明来源,如涉及侵权,请联系作者删除。

×

喜欢就点赞,疼爱就打赏