一、scanner使用
固定格式
import java.util.Scanner; // 1. 导入类 public class Example { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 2. 创建对象 System.out.println("请输入月份:"); int month = scanner.nextInt(); // 3. 读取整数输入(此时写这句话) // 后续使用 month 做逻辑处理... scanner.close(); // 最后关闭扫描器,释放资源 } }二、反转数组for循环
随机生成了含有五个数字的数组
// 使用 for 循环反转数组 int left = 0; int right = arr.length - 1; while (left < right) { // 交换左右指针指向的元素 int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } /* ---------- 原地双指针交换函数 ---------- */ private void reverse(char[] arr, int l, int r) { while (l < r) { char tmp = arr[l]; arr[l] = arr[r]; arr[r] = tmp; l++; r--; }三、ArrayList方法
1.arrylist统一格式:
- E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
- objectName: 对象名。
import java.util.ArrayList; // 引入 ArrayList 类 ArrayList<E> objectName =new ArrayList<>(); // 初始化2.arrylist方法
①.add(Object element) 向列表的尾部添加指定的元素。
②.size() 返回列表中的元素个数。
③.get(int index) 返回列表中指定位置的元素,index从0开始。
四、双指针轮转数组问题
while (i < j) { int temp = nums[i]; nums[i++] = nums[j]; nums[j--] = temp;双指针应用的问题类型:
while (i < j`的双指针套路,核心思想是:
把「两端向中间夹」或「两段区间互换」变成 O(n) 一次扫描。
除了刚才的 数组翻转,下面这些都是高频出现、面试常考的双指针场景:
1. 回文判定
从两头往中间扫,比较字符是否相同。
例题:125. 验证回文串、680. valid palindrome II。
2. 有序数组两数之和
头尾指针,和太大就右移尾,和太小就左移头。
例题:167. Two Sum II。
3. 三数 / 四数之和(n-Sum 套路)
先排序,固定一个数,剩下区间用双指针找两数之和。
例题:15. 3Sum、18. 4Sum。
4. 快慢指针(对撞型变种)
快指针先走 k 步,再两指针同步走,快到底时慢指针就在倒数第 k 个。
例题:19. 删除链表倒数第 N 个结点、876. 链表中间结点。
5. 容器盛水最多(面积最大)
头尾各一根柱子,每次移动短的那根,计算面积更新最大值。
例题:11. Container With Most Water。
6. 滑动窗口「缩左边界」时也用双指针
右指针扩张,满足条件后左指针收缩,区间统计最值。
例题:3. 无重复字符的最长子串、76. 最小覆盖子串。
7. partition 操作(快速排序 / 荷兰国旗)
左右指针把「小于基准」和「大于基准」分开。
例题:75. Sort Colors、215. 数组第 K 大元素。
8. 合并两个有序数组 / 链表
从后往前或从前往后双指针,谁小移谁。
例题:88. Merge Sorted Array、21. Merge Two Lists。
9. 二分查找本身就是双指针
左、右指针向中间夹,找目标或插入位置。
10. 旋转数组的「三次翻转」
189 题,区间翻转用 i < j 双指针原地完成。