0%

在线OJ需要注意的点

整理的内容

  1. OJ在线测试输入输出的模板
  2. Java常用数据结构以及操作
  3. 字符串常用操作

1.OJ在线测试输入输出的模板

  1. 整体框架如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import java.util.*;
    import java.io.*;

    public class Main(){
    public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    while(sc.hasNext()){ //注意,如果输入是多个测试用例,请通过while循环处理多个测试用例

    }
    }
    }

​ 在main函数中写代码

  • 注意:

    不要自定义包名称,否则会报错,即不要添加package answer之类的语句;

    您可以写很多个类,但是必须有一个类名为 Main,并且为public属性,并且Main为唯一的public class;

    Main类的里面必须包含一个名字为’main’的静态方法(函数),这个方法是程序的入口。

  1. 读取输入,有若干种方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 读一个整数
    int n = sc.nextInt();
    // 读一个字符串
    String s = sc.next();
    // 读一个浮点数
    double t = sc.nextDouble();
    // 读一整行
    String s = sc.nextLine();
    // 判断是否有下一个输入
    sc.hasNext()
    sc.hasNextInt()
    sc.hasNextDouble()
    sc.hasNextLine()
  2. 输出方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    System.out.println(); // 调用println()方法时,会自动在后面加上换行符
    System.out.print(); // 如果不希望它加换行符的话,就要使用print()方法
    System.out.printf(); // 格式化输出,不会自动加换行符

    /*** 输出字符串 ***/
    // %s表示输出字符串,也就是将后面的字符串替换模式中的%s
    System.out.printf("%s", new Integer(1212));
    // %n表示换行
    System.out.printf("%s%n", "end line");
    // 还可以支持多个参数
    System.out.printf("%s = %s%n", "Name", "Zhangsan");
    // %S将字符串以大写形式输出
    System.out.printf("%S = %s%n", "Name", "Zhangsan");
    // 支持多个参数时,可以在%s之间插入变量编号,1$表示第一个字符串,3$表示第3个字符串
    System.out.printf("%1$s = %3$s %2$s%n", "Name", "san", "Zhang");

    /*** 输出boolean类型 ***/
    System.out.printf("true = %b; false = ", true);
    System.out.printf("%b%n", false);

    /*** 输出整数类型***/
    Integer iObj = 342;
    // %d表示将整数格式化为10进制整数
    System.out.printf("%d; %d; %d%n", -500, 2343L, iObj);
    // %o表示将整数格式化为8进制整数
    System.out.printf("%o; %o; %o%n", -500, 2343L, iObj);
    // %x表示将整数格式化为16进制整数
    System.out.printf("%x; %x; %x%n", -500, 2343L, iObj);
    // %X表示将整数格式化为16进制整数,并且字母变成大写形式
    System.out.printf("%X; %X; %X%n", -500, 2343L, iObj);


    /*** 输出浮点类型***/
    Double dObj = 45.6d;
    // %e表示以科学技术法输出浮点数
    System.out.printf("%e; %e; %e%n", -756.403f, 7464.232641d, dObj);
    // %E表示以科学技术法输出浮点数,并且为大写形式
    System.out.printf("%E; %E; %E%n", -756.403f, 7464.232641d, dObj);
    // %f表示以十进制格式化输出浮点数
    System.out.printf("%f; %f; %f%n", -756.403f, 7464.232641d, dObj);
    // 还可以限制小数点后的位数
    System.out.printf("%.1f; %.3f; %f%n", -756.403f, 7464.232641d, dObj);

    img

2. Java常用数据结构以及操作

  1. 数组

    1. 不可变长数组 int[] nums = new int[length];

      操作:

      1. 获取数组的大小:nums.length
    2. 可变长数组 List<Integer> list = new ArrayList<>();

      操作:

      1. 添加: list.add(num);
      2. 获取:list.get(index);
      3. 删除:list.remove(index);
      4. 获取数组的大小:list.size()
      5. 判断数组是否含有元素:list.contains()
  2. 链表

    1. 基本数据结构

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      public class ListNode{
      pubic int val;
      public ListNode next;

      public ListNode() {
      }

      public ListNode(int val) {
      this.val = val;
      }

      ListNode(int val, ListNode next) {
      this.val = val;
      this.next = next;
      }

      @Override
      public String toString() {
      return "ListNode{" +
      "val=" + val +
      ", next=" + next +
      '}';
      }
      }
    2. 操作:

      1. 获取链表节点的值:int num = node.val;
      2. 获取链表节点的下一个:ListNode temp = node.next
  3. 哈希

    1. HashSet

      • 实现

        1
        Set<Integer> hashset = new HashSet<>();
      • 操作:

        1. 加入元素:hashset.add(num);
        2. 删除元素:hashset.remove(num);
        3. 判断集合是否为空:hashset.isEmpty()
        4. 清空集合:hashset.clear();
    2. HashMap

      • 实现

        1
        Map<String, Integer> map = new HashMap<>();
      • 操作

        1. 加入键值对:map.put(str, num);
        2. 删除键值对:map.remove(str);
        3. 根据键获取值:int numStr = map.get(str);
        4. 根据键获取值,如果键不存在,则返回设定的值:int value = map.getOrDefault(str, default)
        5. 判断集合是否为空:map.isEmpty()
        6. 清空集合:map.clear();
    • 实现

      1
      Deque<Integer> stack = new LinkedList<>();
    • 操作

      1. 入栈:stack.push(num);
      2. 出栈:stack.pop();
      3. 获取栈顶元素:int num = stack.peek();
      4. 判断栈是否为空:stack.isEmpty()
      5. 获取栈的大小:stack.size()
  4. 队列

    • 实现

      1
      Queue<Integer> queue = new LinkedList<>();
    • 操作

      • 在队尾端插入元素:queue.offer(num);
      • 移除队首元素:queue.poll();
      • 获取队首元素值:int num = queue.peek();

3.字符串常用操作

  1. 字符串与字符数组之间的转换

    • 字符串转字符数组:char[] ch = str.toCharArray();
    • 字符数组转字符串:String str = new String(ch);
  2. StringBuilder类的操作

    1
    StringBuilder sb = new StringBuilder();
    1. 添加字符串:sb.append(str);
    2. StringBuilderString之间的转换
      1. StringBuilder转换为StringString str = sb.toString();
      2. String转换为StringBuilderStringBuilder sb = new StringBuilder(str);