算法刷题Java技巧

Bertha 。 2024-03-26 13:16 138阅读 0赞

文章目录

    1. 大根堆、小根堆
    1. 二维数组排序
  • 3.一维数组int[]排序
    1. 最大值最小值
    1. Map的便捷方法
    1. 栈的实现
    1. 数组默认值
    1. 异或
    1. Arrays
    1. JAVA的ArrayDeque,一个数据结构直接搞定栈队列

1. 大根堆、小根堆

java可用优先队列 PriorityQueue
在构造时就指定比较器即可

  1. // 大根堆 即降序
  2. PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> b - a);

插入元素 add(E e) offer(E e)
peek()/element() 队头元素
poll()/remove() 弹出队头元素

2. 二维数组排序

  • ① 实现Comparator接口 :匿名内部类实现

    int[][] arr = new int [n][2];

    1. // 按照第二个元素升序排序
    2. Arrays.sort(arr,new Comparator<int[]>() {
    3. @Override
    4. // 如果返回值大于0,则交换两元素
    5. public int compare(int[] o1, int[] o2) {
    6. return o1[1]-o2[1];
    7. }
    8. });

再补一个,先按第一列升序排序,若第一列相等,再按第二列升序排序

  1. int[][] arr = new int [n][2];
  2. // 按照第二个元素升序排序
  3. Arrays.sort(arr,new Comparator<int[]>() {
  4. @Override
  5. // 如果返回值大于0,则交换两元素
  6. public int compare(int[] o1, int[] o2) {
  7. if(o1[0] == o1[1]){
  8. return o1[1]-o2[1];
  9. }
  10. return o1[0]-o2[0];
  11. }
  12. });
  • ② lambda表达式实现

    Arrays.sort(arr,(a,b)-> a[1]-b[1]);

    Arrays.sort(arr,(a,b)-> {

    1. if(a[0] == b[0]){
    2. return a[1] - b[1];
    3. }
    4. return a[0]-b[0];
    5. });

3.一维数组int[]排序

由于Arrays.sort里面的比较器只能用Integer,int[]数组是不可以的,所以只有2种方法

  1. int[] nums = new int[]{
  2. ...};
  3. nums = IntStream.of(nums)
  4. .boxed()
  5. .sorted((o1, o2) -> o2-o1)
  6. .mapToInt(Integer::intValue).toArray();

或者自定义个List

  1. List<Integer> list = new ArrayList<>();
  2. for (int num : nums) {
  3. list.add(num);
  4. }
  5. list.sort((a, b) -> b-a);

如果数组元素是Integer,直接

  1. Arrays.sort(arr,(a, b) -> b-a);

4. 最大值最小值

  1. int min=Integer.MIN_VALUE;
  2. int max=Integer.MAX_VALUE;

5. Map的便捷方法

Map.getOrDefault(key,默认值); 没有值就赋默认值
Map.putIfAbsent(key, value) 只有key不存在的时候才会覆盖
a = Map.computeIfAbsent(key, value) 返回map中当前key对应的值,即若key存在,返回旧值,key不存在,返回新值

更快捷的
比如如果pre的key存在,对应value+1,如果不存在,新建key为pre,value=1
原本需要这样写,
map.put(pre,map.getOrDefault(pre,0)+1);
但现在:

  1. map.merger(pre,1,Integer::sum);
  2. 如果没有prekeyvalue1,如果有,就相加
  3. 或者
  4. map.merge(pre,1,(o1,o2)-> o1+o2); o1老数据 o2新数据

6. 栈的实现

  1. Deque<Integer> stack = new LinkedList();
  2. stack.peek(); 查看栈顶元素
  3. stack.pop(); 弹出栈顶元素
  4. stack.push(); 放入栈顶
  5. stack.isEmpty(); 栈是否为空

7. 数组默认值

  1. Arrays.fill(result,-1);//默认全部初始化为-1

8. 异或

任何元素异或 0 都等于自己 x^0=x
任何元素异或自己都等于0 x^x=0
异或有交换律和结合律

  1. // 用异或实现两个数的交换
  2. a = a ^ b;
  3. b = a ^ b;
  4. a = a ^ b;

9. Arrays

  • 1)Arrays.toString()

    int[] a = {

    1. 1,2,3,4,5};

    System.out.println(Arrays.toString(a));
    // 输出格式:[1,2,3,4,5]

2)Arrays.sort()

  • Arrays.sort(数组名) 默认升序
  • Arrays.sort(数组名,起始下标,结束下标) 左闭右开原则
  • 降序重写lamb表达式只能用包装类
  1. Arrays.equals()
    比较两个数组内容是否相等
  2. Arrays.binarySearch()
    在数组中查找元素
    使用的前提是数组有序

int Arrays.binarySearch( Datatype[], Datatype key)
// 若找到,则返回此值的下标, 若没找到,返回 -插入点-1;

5)Arrays.copyOf()
第一个参数是原数组,第二个参数是拷贝长度,返回值是将原数组拷贝一份返回

10. JAVA的ArrayDeque,一个数据结构直接搞定栈队列

注意:ArrayDeque无法插入NULL,若需要插入NULL使用LinkedList
当作栈

pop() 移除栈顶元素
peek() 获取栈顶元素
push() 添加栈顶元素

当作队列

add() 队列尾部添加元素
offer() 队列尾部添加元素,返回是否成功
poll()/remove() 删除队列第一个元素 无元素poll()返回null remove()报异常
peek()/element() 获取队列第一个元素

通用操作

addFirst() 在数组前面添加元素
addLast() 在数组后面添加元素
pollFirst()/removeFirst() 删除第一个元素,并返回删除元素的值
pollLast()/removeLast() 删除最后一个元素,并返回删除元素的值
getFirst() 获取数组第一个元素
getLast() 获取数组最后一个元素
offerFirst() 在数组前面添加元素,返回是否成功
offerLast() 在数组后面添加元素,返回是否成功

其他操作

isEmpty() 是否为空
size() 容量
contains() 是否存在该元素

发表评论

表情:
评论列表 (有 0 条评论,138人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心算法

    1.递增数组 题目链接:[递增数组][Link 1] 题目介绍: > 牛牛有一个数组array,牛牛可以每次选择一个连续的区间,让区间的数都加1,他想知道把这

    相关 算法-

    剑指Offer快速过了一遍 字节-飞书高频题-前15 各公司的高频面试算法题,可在 [CodeTop][]查询 (1) 146. LRU 缓存机制 我的实现