摘要:算法练习的本质也在于锻炼编程思维,强化程序员的内力。因此给自己后面会持续更新的算法技巧内容简称算法易筋经。

本文分享自华为云社区《<java算法易筋经>之常见java-API使用》,原文作者:breakDraw 。

易筋经源于我国古代中医导引术,具有强健体魄、预防疾病的效果,长期以来在佛家及民间习武人士之间广为流传。算法练习的本质也在于锻炼编程思维,强化程序员的内力。因此给自己后面会持续更新的算法技巧内容简称算法易筋经。

无论你使用什么语言开始训练算法, 总是得掌握基本的。 我这边只以java举例,其他语言类似。以leetcode类型的平台为主。

java数组和list互转

有时候给定的输入是个数组,中间过程我们想转成list并使用list的一些api。 但是这没那么简单。

请打开自己的编译器,然后看下下面几个问题能否不用for循环写成功。(用for循环也是对的,考试时如果忘记了,就选择能用的方法)

  • 请把字符串数组转list
  • 请把字符串list转数组
  • 请把list<Integer>转int[]
  • 请把int[]转成List<Integer>

就像下面这样,自己造个类,测试一下看能否秒写:

public class ListArrayUtil {
// 请把字符串数组转list
public List<String> arrToListStr(String[] arr) {
return null;
} // 请把字符串list转数组
public String[] listToArrStr(List<String> list) {
return null;
} // 请把list数组转成int[]
public List<Integer> arrToListInt (List<Integer> num) {
return null;
} // 请把int[] 数组转成list
public List<Integer> arrToListInt (int[] num) {
return null;
}
}

有些人可能会误以为int[]和Integer[]是可以自动转的,然后对于数组而言,编译器无法用识别,会报错。因此如果涉及这种基础类型的数组列表转换,请记住要么马上使用stream,要么直接for循环写一下,不要卡在这个编译错误这研究半天。

我的答案:

public class ListArrayUtil {
// 请把字符串数组转list
public List<String> arrToListStr(String[] arr) {
return Arrays.asList(arr);
} // 请把字符串list转数组
public String[] listToArrStr(List<String> list) {
return list.toArray(new String[list.size()]);
} // 请把list数组转成int[]
public int[] arrToListInt (List<Integer> list) {
// 不可以toArray,int[]和Integer[]是不同的
//return list.toArray(new int[list.size()]);
return list.stream()
.mapToInt(Integer::valueOf)
.toArray();
} // 请把int[] 数组转成list
public List<Integer> arrToListInt (int[] num) {
// 不可以asList,因为int[]和Integer[]不同
// return Arrays.<Integer>asList(num);
return Arrays
.stream(num)
.boxed()
.collect(Collectors.toList());
}
}

list和数组的初始化

初始化可没那么简单,尤其是涉及返回List[]作为结果时,总是有人会忘记要先初始化数组里的每个list才能使用。请完成以下内容:

  • 初始化list<Integer>为5个1
  • 初始化int[]为5个1
  • 初始化1个包含5个list的lis[]数组,并且里面的list已经初始化完成

正确答案如下:

public class ListUtil {

    // 初始化list为5个1
public static List<Integer> fillList() {
List<Integer> list = Collections.nCopies(5,1);
System.out.println(list);
return list;
} // 初始化arr为5个1
public static int[] fillArr() {
int[] arr = new int[5];
Arrays.fill(arr, 1);
return arr;
} // 返回1个list数组,并且里面的list已经初始化完成
public static List[] fillListArray() {
List[] lists = new List[5];
IntStream.rangeClosed(0, 4).boxed()
.forEach(i->lists[i] = new ArrayList());
return lists;
}
}

排序

关于如何快速对list和数组排序,在IDEA自己解答以下问题:

  • Arrays和List如何对int[]数组做倒序排序
    Arrays.sort()
    Collections.sort()
  • 对于一个新对象,怎么做自定义排序?
    如下。定义一个comparable
public class Student implements Comparable<Student> {
private int stuId;
private String stuName;
private int score;
@Override
public int compareTo(Student o) {
return stuId-o.stuId;
}
}

参考题目:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/

map相关

  • 如果map里的value是个list,每次往某个key里的list放数据时,必须要先初始化list, 怎么减少初始化代码?

答案:
使用getOrDefault:
map.getOrDefault(key, new ArrayList<>()).add(xxx)
图结果那边还蛮常用的

不做重复的put

if (!map.containsKey(key)) {
map.put(key, value);
}

可以优化成
map.putIfAbsent(key, value)
字面意思: absent指不存在,那么就是不存在的时候,把value放入,如果存在,则直接返回原value值。

map中的值做更新

例如每次对key中的值加1
有两种方式:

map.put(key, map.getOrDefault(key, 0)+1);
map.compute(key, (k,v)->(v==null?1:v+1));

在一个比较复杂的情况下,compute比较有用。

computeIfAbsent(key, (k,v)->f(k,v)) 只在key不存在的时候,才计算这个labmda式子。 如果存在的话,就不计算了,直接返回旧值。

computeIfPresent(key, (k,v)->f(k,v)) 只有存在才会更新,不存在就不更新。

常见队列用法

  • 普通队列:
  • 优先队列priorityQueue:
    能够保证出队的永远是按照你设定的最大或者最小的元素。
    很有用。

用labma写内部比较式子,避免忘记接口怎么写
PriorityQueue<int[]> queue = new PriorityQueue<>((a, b) -> a[1] - b[1]);
a[1] - b[1] 是小顶堆
a[1]-b[1] >0,则交换。

如何记忆?
堆更新的时候,都是从上往下更新的, 让
那么a是上面的点,b是下面的点(儿子节点)
当返回大于0时,交换a和b。

这样就好理解了
大顶堆: a-b<0时,需要交换,即父亲比儿子小,所以需要交换
小丁堆: a-b>0, 需要交换, 即父亲比儿子大,得换,让父亲是小顶。

  • 优先队列延时删除
    当优先队列中某个元素会被删除,但是不在堆顶时,使用延迟删除, 直到他走到堆顶才会清理。
    因此这时候要使用额外的数量realCount来统计队列实际数量, 并使用特定的删除标志位(勿用会干扰到队列compare方法的方式去设定删除标志位)

简易二分查找

  • 在一个list中找到最靠近x且大于等于x值的元素

不想手写二分的话用这个方法:

  • 在一个list中找到最靠近x且小于等于x的元素
    使用treeMap放置数据
    floorKey(key) 可以找到小于等于给定键的最大键
    如果不存在这样的键,则返回null。

ceilingKey(key) 找到大于等于给定键的最小键
不存在则返回null

记忆:

ceiling向上舍入,那就是找key的上边。 ceiling有天花板的意思,于是就理解成是向上找。

floor 向下摄入,那就是找key的下边。 有沉入水下的意思,于是理解成向下。

  • 在list中找到最靠近x且大于(不包含等于)x的元素

例题:https://leetcode-cn.com/problems/previous-permutation-with-one-swap/submissions/

点击关注,第一时间了解华为云新鲜技术~

java算法易筋经:常见java-API使用技巧的更多相关文章

  1. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  2. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  3. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  4. java算法 蓝桥杯 文化之旅

    问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...

  5. java算法 蓝桥杯 摆花

    问题描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  6. java算法 蓝桥杯 洗牌

    问题描述 小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌.虽然小弱T不怎么会洗牌,但是他却总是输. 渐渐地小弱T发现了一个规律:只要自己洗牌,自己就一定会输.所以小弱T认为自己洗牌不够均匀,就独 ...

  7. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  8. 常见算法合集[java源码+持续更新中...]

    一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...

  9. Java基础学习-常见API

    package commonAPIs; /*java.lang 类 Object java.lang.Object public class Object类 Object 是类层次结构的根类.每个类都 ...

  10. 常见Java基础知识(较长)

    1.抽象:  抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象, ...

随机推荐

  1. 从零用VitePress搭建博客教程(6) -– 第三方组件库的使用和VitePress搭建组件库文档

    接上一节:从零用VitePress搭建博客教程(5) - 如何自定义页面模板.给页面添加独有的className和使页面标题变成侧边目录? 九.第三方组件库的使用 我们经常看见UI组件库的文档,这里我 ...

  2. 详解GuassDB数据库权限命令:GRANT和REVOKE

    本文分享自华为云社区<GuassDB数据库的GRANT & REVOKE>,作者: Gauss松鼠会小助手2 . 一.GaussDB的权限概述 在数据库中,对象的创建者将成为该对象 ...

  3. 美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?

    这是一道面试中常见的 Redis 基础面试题,主要考察求职者对于 Redis 应用场景的了解. 即使不准备面试也建议看看,实际开发中也能够用到. 内容概览: Redis 除了做缓存,还能做什么? 分布 ...

  4. 一次完整的Http请求过程(转)

    一次完整的Http请求过程 在网上看了很多关于http完整流程的介绍文档,都讲的很不错,但是还是各有缺失,所以自己就根据学习及理解整理了一张图,给大家分享下http一次完整的交互流程,只是大概画了下流 ...

  5. 使用openpyxl库读取Excel文件数据

    在Python中,我们经常需要读取和处理Excel文件中的数据.openpyxl是一个功能强大的库,可以轻松地实现Excel文件的读写操作.本文将介绍如何使用openpyxl库读取Excel文件中的数 ...

  6. 创造力的起源《The Origins of Creativity》

    接近创造力 创造力是对原创的追求,其动力是人类对于新奇事物的钟爱. 了解创造力需要三个层次的思考. 1.What(如何定义这种现象) 2.Question(发问,他是如何出现的,导致其出现的最初原因是 ...

  7. parallel-comparator-200

    直接上来就是c代码,这种题还是第一次做,直接写代码逆向回去就行了 但是奈何水平太低写不回去... 分析 需要下面的两个字符串相等才能得到正确的程序,若要相等就只能让result等于0 那就意味着亦或的 ...

  8. [ARC105E] Keep Graph Disconnected

    题目链接 好题. 如果 \(1\) 和 \(n\) 一直联通,开始即结束. 如果 \(n\mod 4=1\),那么 \(\frac 12x(x+1)+\frac12(n-x)(n-x+1)\) 为偶数 ...

  9. [USACO2022OPEN S] Subset Equality S

    [USACO22OPEN] 题目描述 奶牛们正在尝试一种相互交换编码信息的新方法,她们在相关的字母中混入不相关的字母,使信息难以解码. 奶牛们传输两个字符串 \(s\) 和 \(t\),每个字符串的长 ...

  10. ElasticSearch-document文档数据-增删改

    文档就是相当于每条记录. 每个文档(数据记录行)都有几个元数据,分别是: _index,表示该文档是那个索引中的. _type,表示文档的类型 _id,文档的唯一ID编号 _score,相关性分数. ...