【java API】leetcode常用刷题API及ACM模式

打印 上一主题 下一主题

主题 1734|帖子 1734|积分 5202

ACM输入 Scanner

  1. import java.util.Scanner;
  2. public class ScannerDemo {
  3.     public static void main(String[] args) {
  4.         Scanner scan = new Scanner(System.in);
  5.         // 从键盘接收数据
  6.         // next方式接收字符串
  7.         System.out.println("next方式接收:");
  8.         // 判断是否还有输入
  9.         if (scan.hasNext()) {
  10.             String str1 = scan.next();
  11.             System.out.println("输入的数据为:" + str1);
  12.         }
  13.         scan.close();
  14.     }
  15. }
复制代码
  $ javac ScannerDemo.java
$ java ScannerDemo
next方式接收:
runoob com
输入的数据为:runoob
  可以看到 com 字符串并未输出
使用 nextLine 方法:
  1. // 判断是否还有输入
  2.         if (scan.hasNextLine()) {
  3.             String str2 = scan.nextLine();
  4.             System.out.println("输入的数据为:" + str2);
  5.         }
复制代码
  runoob com
输入的数据为:runoob com
  如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法举行验证,再使用 nextXxx() 来读取。



以下是针对ACM模式刷题时,字符串和集合相干的高频Java API总结(按使用频率排序):

一、字符串高频API


  • String类
  1. String str = "abc";
  2. // 基础操作
  3. str.length()              // 字符串长度
  4. str.charAt(int index)     // 获取字符(高频)
  5. str.substring(int start) // 截取子串(含start)
  6. str.substring(int start, int end) // 截取[start,end)
  7. str.split(String regex)  // 分割字符串(高频,如处理输入)
  8. str.toCharArray()        // 转字符数组(高频用于遍历)
  9. str.equals(String other) // 比较内容(非地址)
  10. str.indexOf(String s)    // 查找子串位置
  11. // 类型转换
  12. Integer.parseInt(str)    // 字符串转整数(高频)
  13. String.valueOf(int/double...) // 其他类型转字符串(高频)
  14. str.toLowerCase() / toUpperCase() // 大小写转换
  15. // 其他
  16. str.trim()               // 去除首尾空格
  17. str.replace(old, new)    // 替换字符/字符串
  18. str.contains(String s)   // 是否包含子串
复制代码

  • StringBuilder(高频!线程不安全但更快)
  1. StringBuilder sb = new StringBuilder();
  2. sb.append("a")           // 追加内容(高频)
  3. sb.insert(index, "x")    // 插入
  4. sb.delete(start, end)    // 删除
  5. sb.reverse()             // 反转(高频用于回文题)
  6. sb.toString()            // 转String(最终输出)
复制代码

  • Character
  1. Character.isLetter()
  2. Character.toLowerCase()
复制代码

二、集合高频API


  • List(ArrayList最常用)
  1. List<Integer> list = new ArrayList<>();
  2. // 基础操作
  3. list.add(element)        // 添加元素(高频)
  4. list.get(int index)      // 获取元素(高频)
  5. list.size()              // 元素个数(高频)
  6. list.remove(int index)   // 按索引删除
  7. list.remove(Object o)    // 按对象删除
  8. list.contains(Object o)  // 是否包含元素
  9. list.isEmpty()           // 判空
  10. // 工具方法
  11. Collections.sort(list)   // 排序(高频)
  12. Collections.reverse(list) // 反转
  13. Collections.max(list) / min(list) // 最大/最小值
  14. Collections.fill(list, val) // 填充
  15. // 数组互转
  16. Arrays.asList(T... a)    // 数组转List(注意返回固定大小List)
  17. list.toArray(new T[0])   // List转数组
复制代码

  • Map(HashMap最常用)
  1. Map<K, V> map = new HashMap<>();
  2. // 基础操作
  3. map.put(key, value)      // 添加/覆盖键值对(高频)
  4. map.get(key)             // 获取值(高频)
  5. map.containsKey(key)     // 是否包含键(高频)
  6. map.getOrDefault(key, defaultValue) // 安全获取
  7. map.remove(key)          // 删除键
  8. map.size()              // 键值对数量
  9. // 遍历(高频)
  10. for (Map.Entry<K, V> entry : map.entrySet())
  11. //PriorityQueue(优先队列)
  12. PriorityQueue<Map.Entry<Character, Integer>> pq = new PriorityQueue<>(
  13.     (a, b) -> b.getValue() - a.getValue()
  14. );
  15. pq.addAll(map.entrySet());
复制代码
以下是栈(Stack)和链表(LinkedList)在ACM模式刷题时的高频Java API总结,包含焦点操作和避坑指南:

三、栈(Stack)高频API

1. 推荐用Deque替代Stack类(更高效且线程不安全,适合算法场景)

  1. Deque<Integer> stack = new ArrayDeque<>();
复制代码
2. 焦点操作

方法说明示例push(e)入栈stack.push(5);pop()出栈(空栈会抛非常)int top = stack.pop();peek()查察栈顶元素(不删除)int top = stack.peek();isEmpty()判断栈是否为空if (stack.isEmpty()) {...}size()获取元素个数int len = stack.size(); 3. 经典应用场景



  • 括号匹配:用栈存储左括号,碰到右括号时弹栈匹配
  • 单调栈:维护栈内元素单调性(递增/递减)
  • 表达式求值:处理运算符优先级
4. 避坑指南



  • 空栈检查:pop()和peek()前必须检查栈是否为空,否则会抛出NoSuchElementException
  • 性能对比:优先用ArrayDeque而非Stack类(后者同步操作性能差)

四、链表(LinkedList)高频API

1. 内置LinkedList类

  1. LinkedList<Integer> list = new LinkedList<>();
复制代码
2. 焦点操作

方法说明时间复杂度addFirst(e)头部插入元素O(1)addLast(e)尾部插入元素O(1)removeFirst()删除头部元素(空链表抛非常)O(1)removeLast()删除尾部元素(空链表抛非常)O(1)getFirst()获取头部元素(不删除)O(1)getLast()获取尾部元素(不删除)O(1)get(int index)获取第index个元素(低效,慎用)O(n)size()获取链表长度O(1) 3. 自定义链表节点(LeetCode常用)

  1. class ListNode {
  2.     int val;
  3.     ListNode next;
  4.     ListNode(int x) { val = x; }
  5. }
  6. // 操作示例:反转链表
  7. ListNode dummy = new ListNode(-1);
  8. while (head != null) {
  9.     ListNode next = head.next;
  10.     head.next = dummy.next;
  11.     dummy.next = head;
  12.     head = next;
  13. }
  14. return dummy.next;
复制代码
4. 经典应用场景



  • 链表反转:迭代或递归修改指针指向
  • 归并有序链表:双指针遍历比力
  • 快慢指针:检测环、找中点(如判断回文链表)
  • 虚拟头节点:简化头节点界限处理
5. 避坑指南



  • 指针丢失:修改链表节点指针时,注意提前生存next节点
  • 循环引用:操作链表后注意检查是否成环
  • 性能陷阱:避免频繁调用get(index)(链表随机访问是O(n))

五、实用代码片断

1. 用栈实现队列

  1. class MyQueue {
  2.     Deque<Integer> inStack = new ArrayDeque<>();
  3.     Deque<Integer> outStack = new ArrayDeque<>();
  4.     public void push(int x) {
  5.         inStack.push(x);
  6.     }
  7.     public int pop() {
  8.         if (outStack.isEmpty()) {
  9.             while (!inStack.isEmpty()) {
  10.                 outStack.push(inStack.pop());
  11.             }
  12.         }
  13.         return outStack.pop();
  14.     }
  15. }
复制代码
2. 快慢指针找链表中点

  1. ListNode slow = head, fast = head;
  2. while (fast != null && fast.next != null) {
  3.     slow = slow.next;       // 慢指针走1步
  4.     fast = fast.next.next;  // 快指针走2步
  5. }
  6. // slow即为中点(偶数个节点时靠左)
复制代码

掌握这些API和技巧后,可以高效解决栈和链表相干的算法题,注意界限条件和指针操作的细节!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表