刷算法题常用工具类集锦(Java)

前言

本文章用于记录解算法题中常被用到的一些类及相关方法,在很多平台解算法题是没有智能补全或提示的,所以只能靠记,记住这些工具类及其用法是解题的基础。

队列

Queue

java 复制代码
// `ArrayDeque` 是 Java 中实现 `Deque` 接口的一个类,它可以用作队列(FIFO)或双端队列(LIFO)。
Queue<Integer> queue=new ArrayDeque<>();
// 常用方法
// 1. 元素入队
queue.add(10); // 添加元素到队列尾部 如果队列已满,抛出 `IllegalStateException`
queue.offer(20); // 添加元素到队列尾部,如果队列已满,返回 `false`,而不是抛出异常。

// 2. 元素出队
int firstElement = queue.remove(); // 移除并返回队列头部的元素,如果队列为空,抛出 `NoSuchElementException`。
Integer firstElementOrNull = queue.poll(); // 移除并返回队列头部的元素,队列为空时返回 null

// 3. 查看队头元素
int headElement = queue.element(); // 返回队列头部的元素,但不移除,如果队列为空,抛出 `NoSuchElementException`。
Integer headElementOrNull = queue.peek(); // 返回队列头部的元素,队列为空时返回 null

// 4. 其他常用方法
int size = queue.size(); // 返回队列中的元素数量
boolean isEmpty = queue.isEmpty(); // 检查队列是否为空
queue.clear(); // 清空队列

// 5. 双端队列操作
// 虽然 `ArrayDeque` 可以用作队列,但它也支持双端队列的操作
queue.addFirst(5); // 将元素添加到队列头部
queue.addLast(15); // 将元素添加到队列尾部
int first = queue.removeFirst(); // 移除并返回队列头部的元素
int last = queue.removeLast(); // 移除并返回队列尾部的元素
int head = queue.getFirst(); // 返回队列头部的元素
int tail = queue.getLast(); // 返回队列尾部的元素

优先队列

PriorityQueue 是 Java 中基于优先级堆(Priority Heap)实现的一个队列,它的元素按照优先级顺序出队(默认是最小堆,即最小元素优先出队)。以下是 PriorityQueue 的使用示例,其有的方法和普通队列一样,只是会根据排序规则决定出队的顺序而已。

java 复制代码
    // 匿名实现比较器
    public static Comparator<Customer> idComparator = new Comparator<Customer>() {
        @Override
        public int compare(Customer c1, Customer c2) {
            return c1.getId() - c2.getId(); // 按 ID 升序排列
        }
    };
    
    // 创建优先队列,指定初始容量和比较器
    Queue<Customer> customerPriorityQueue = new PriorityQueue<>(7, idComparator);
    
    /*
        更简洁的写法: 使用 Lambda 表达式实现比较器
        Queue<Customer> customerPriorityQueue = new PriorityQueue<>(7, (c1, c2) -> c1.getId() - c2.getId());
    */
    
    // 添加元素
    customerPriorityQueue.add(new Customer(5));
    customerPriorityQueue.add(new Customer(1));
    customerPriorityQueue.add(new Customer(3));

PriorityQueue 不是线程安全的。如果需要在多线程环境中使用,可以使用 java.util.concurrent.PriorityBlockingQueue

栈

Deque

java 复制代码
// 可用以下这 3 种实现
Deque<Integer> stack = new ArrayDeque<>();

Deque<Integer> stack=new LinkedList<>(); 

Stack<Integer> stack=new Stack<>();

/*
    常用方法
-   `void push(E e)`: 将元素压入栈顶。
-   `E pop()`: 移除并返回栈顶元素。
-   `E peek()`: 返回栈顶元素,但不移除。
-   `boolean isEmpty()`: 检查栈是否为空。
-   `int size()`: 返回栈中元素的数量。
-   `void clear()`: 清空栈。
*/

三者区别:

特性 ArrayDeque Stack LinkedList
​底层数据结构 动态循环数组 动态数组(继承自 Vector) 双向链表
​线程安全 不安全 安全(同步机制) 不安全
​性能 高效(O(1) 操作) 较低(同步开销) 高效(O(1) 操作)
​推荐使用场景 栈或双端队列 不推荐使用(设计较老) 栈或双端队列
​随机访问 不支持 支持 不支持
​额外功能 双端队列操作 search() 方法 双端队列操作

数组

Arrays

java 复制代码
// 整数数组求和
int total= Arrays.stream(nums).sum();
// 整数数组获取最小值
int min = Arrays.stream(nums).min().getAsInt();

// 排序
Arrays.sort(nums);

// 数组比较
Arrays.equals(nums1, nums2);

字符

java 复制代码
// 判断字符是否是 字母 或 数字
Character.isLetterOrDigit(ch1);
// 将字符转为小写(对字母而言)
Character.toLowerCase(ch1);  // 用于将字符转换为小写。如果字符已经是小写或不是字母,则返回原字符

字符串

字符串数组拼接

java 复制代码
String.join(" ",strs);

字符串构建

java 复制代码
StringBuffer cur = new StringBuffer();
cur.append(str);
cur.delete(start, cur.length());

字符串转字符数组

java 复制代码
char[] sc = str.toCharArray();

随机数生成

java 复制代码
// 1. 使用 Random 生成随机数
Random random = new Random();
// 生成一个 0 到 9 之间的随机整数
int a = random.nextInt(10);
// 生成一个 0 到 9 之间的随机 long 整数
long b = random.nextLong(10);
// 生成一个 0 到 10(不包含) 之间的随机浮点数
double c = random.nextDouble(10);

// 2. 使用 Math.random() 生成随机数
// `Math.random()` 是 `Math` 类的静态方法,返回一个 `[0.0, 1.0)` 范围内的伪随机 `double` 值。
// 通过乘以一个范围值并强制转换为 `int`,可以生成一个随机整数
int num = (int) (Math.random() * 10); // 生成一个 0 到 9 的随机整数

两种方法对比

特性 Random.nextInt(int bound) Math.random() + 强制转换
​类 Random 类 Math 类
​方法 nextInt(int bound) Math.random()
​返回值 [0, bound) 范围内的 int [0.0, 1.0) 范围内的 double
​随机性 伪随机数,基于种子 伪随机数,基于系统时间
​性能 较高 较低(涉及浮点数运算和转换)
​线程安全 不安全 安全(静态方法)
​适用场景 需要生成多个随机数时 生成单个随机数或简单场景

集合

元素排序

java 复制代码
        // 使用匿名内部类实现比较器,按值降序排列
        Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue()); // 降序排列
            }
        });
        
        // 使用 Lambda 表达式简化代码
        Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));
        
        // 对于简单的比较规则,可以使用 `Comparator.comparing` 方法。例如:Comparator.comparingInt(Customer::getId)
        Collections.sort(list, Comparator.comparing(Map.Entry::getValue, Comparator.reverseOrder()));

元素删除

java 复制代码
//此处需要注意list.remove()方法中的参数传的是索引
list.remove(list.size()-1);
// 传的是key
hashMap.remove(val);

元素交换

java 复制代码
// 集合元素交换
Collections.swap(curList, i, first);

基本类型

java 复制代码
// 字符串转整型
Integer a = Integer.parseInt(s);

内容会继续更新、完善 ~

相关推荐
纪念 22919 分钟前
C++ 算法(模拟)
开发语言·c++·算法
揽星河..22 分钟前
【C语言】函数
c语言·算法
zwc321043205525 分钟前
Day 2:图像内存、数据类型与stride
c++·人工智能·opencv·算法·计算机视觉
重生之小比特39 分钟前
【算法拾光】模拟|提莫攻击 + N 字形变换
算法·模拟
XiYang-DING1 小时前
P4104.环形链表判断
数据结构·链表
東隅已逝,桑榆非晚1 小时前
AVL数实现
c++·笔记·学习·算法
驭渊的小故事1 小时前
LeetCode 算法题解:滑动窗口与数组合并的实战应用
算法·leetcode·职场和发展
.YM.Z2 小时前
优选算法——【双指针算法2】C++实现
开发语言·c++·算法
逆向编程2 小时前
MATLAB高级数据结构:cell、struct与table深度应用
开发语言·数据结构·matlab
zwc32104320552 小时前
第四周第五天——重构成类
c++·人工智能·opencv·算法·计算机视觉