算法刷题Java技巧

1. 大根堆、小根堆

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

// 大根堆 即降序
 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];
		// 按照第二个元素升序排序
        Arrays.sort(arr,new Comparator<int[]>() {
            @Override
            // 如果返回值大于0,则交换两元素
            public int compare(int[] o1, int[] o2) {
                return o1[1]-o2[1];
            }
        });

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

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

 Arrays.sort(arr,(a,b)-> {
            if(a[0] == b[0]){
                return a[1] - b[1];
            }
            return a[0]-b[0];
        });

3.一维数组int[]排序

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

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

或者自定义个List

 List<Integer> list = new ArrayList<>();
        for (int num : nums) {
            list.add(num);
        }

        list.sort((a, b) -> b-a);

如果数组元素是Integer,直接

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

4. 最大值最小值

int min=Integer.MIN_VALUE;
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);
但现在:

map.merger(pre,1,Integer::sum);
如果没有pre的key,value为1,如果有,就相加
或者 
map.merge(pre,1,(o1,o2)-> o1+o2);  o1老数据 o2新数据

6. 栈的实现

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

7. 数组默认值

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

8. 异或

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

// 用异或实现两个数的交换
a = a ^ b;
b = a ^ b;
a = a ^ b;

9. Arrays

  • 1)Arrays.toString()
int[] a = {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() 是否存在该元素

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值