算法刷题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() 是否存在该元素

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

范大

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

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

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

打赏作者

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

抵扣说明:

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

余额充值