Java常用方法
基本类型
1、String常用方法
//获取子串下表
String str1="23asdf828fasg2gag";
System.out.println(str1.indexOf("l"));//返回str中第一个“l”下标 从0开始算 ,没有则返回-1
//获取子串
String str2="23asdf828fasg2gag";
System.out.println(str2.substring(0,3));//23a
//获取某下标的值
String str3="23_asdf828fasg2gag";
System.out.println(str3.codePointAt(2));//获取ASCII编码
System.out.println(str3.charAt(2));//获取字符
//转字符char数组
String str4="asdbvhkwiuvb"
str4.toCharArray();
2、字符串反转
使用 StringBuilder
对象或 StringBuffer
对象的 reverse() 方法
StringBuilder sb = new StringBuilder("abcd").reverse();
System.out.println(sb);//dcba
3、String 与 其他类型
String转int:Integer.valueOf("345678")
//入参不能有非数字
集合Collection && 数组
拷贝创建数组:Arrays.copyOfRange(数组,fromIndex,toIndex);
数组排序:Arrays.sort(数组);
排序:
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(10);
list.add(13);
list.add(12);
list.add(11);
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
System.out.println(list);
}
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(10);
list.add(13);
list.add(12);
list.add(11);
Collections.sort(list);
System.out.println(list);
}
IO
常用类
栈 Stack
队列
253. 会议室 II 使用的排序
堆
优先队列/小根堆 PriorityQueue
//通过设置参数为比较器,创建大根堆或小根堆
PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
Hash
1、使用hash去重
public static void main(String[] args) {
List set = new ArrayList();
set.add(1);
set.add(2);
set.add(2);
set =duplicateList(set);
Iterator iter = set.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
//用HashSet的无序性、不可重复,过滤重复数值
public static List duplicateList(List list) {
HashSet set = new HashSet();
set.addAll(list);
return new ArrayList(set);
}
2、hash计数
Hashtable<Integer,Integer> hashtable=new Hashtable<>();
hashtable.put(10,1);
if (hashtable.containsKey(10)){
Integer integer = hashtable.get(10);
integer++;
hashtable.put(10,integer);
}
System.out.println(hashtable.get(10));
3、LRU 最近最少使用
leetcode
树
DFS/BFS
200. 岛屿数量
39. 组合总和
254. 因子的组合
490. 迷宫
1102. 得分最高的路径 DFS+二分
分割
Prim && Kruskal
图
拓扑排序
Math
常用算法
递归
回溯法
使用场景:组合、排列、子集、切割等
例题:
例题
leetcode46. 全排列
动态规划 DP
概念:发现计算过程中有重复计算部分,则把答案记下来,下次直接用。
例题:斐波那契
例题:背包问题
暴力:从左往右,依次选择要或者不要,构成递归
傻缓存:有重复分支,用n维数组缓存
DP:从n维数组找依赖
TIPS:
在还不熟悉 的时候,先暴力写出来(例如递归、BFS、DFS等),再改傻缓存,最终动态规划:例题
当出现重复点的时候可以优化
模型
从左到右:
背包问题
leetcode1
leetcode300
leetcode309
53. 最大子数组和
122. 买卖股票的最佳时机 II顺便看看贪心
范围:例如两个人只能从数组左右选,谁选的总和最大。(先手后手问题)重点是开头如何如何、结尾如何如何
样本对应:最长公共子序列问题 例题
业务:
必会
最长子序列应用:
leetcode
滑动窗口
JZ59 滑动窗口的最大值
76. 最小覆盖子串
JZ85 连续子数组的最大和(二)
剑指 Offer II 016. 不含重复字符的最长子字符串
159. 至多包含两个不同字符的最长子串注意value部分存的是下标而不是个数,右指针更新下表,这样左指针就能从删除的下表开始。
340. 至多包含 K 个不同字符的最长子串
双指针
贪心
保证局部最优,使得最后出现的结果全局最优。
例题
并查集
323. 无向图中连通分量的数目
305. 岛屿数量 II
1061. 按字典序排列最小的等效字符串
累加和 累乘积
数学
x进制
算法知识体系(Java)
位运算
int类型占4个字节 共32位。正整数最大 231-1,复数最大 -231。首位是符号位。
正数二进制:首位是0,后面是这个数的二进制。
负数二进制:首位是1,后面是的二进制取反+1 表示数值。例如:-1对应1111……111全是1
ps:按位取反符号
int a=3456789;
int b=~a;
二进制输出
public static void print(int num){
for(int i=31,i>=0;i--){
System.out.print(num&(i<<i)==0?"0":"1")
}
System.out.println()
}
右移
有两种右移:>>
和 >>>
>>
表示带着标志位一起右移一位,负数会右移之后在符号位补上1
>>>
表示不带标志位右移,负数右移之后符号位补0
相反数
正负数都适用
int a =5;
int b=-a;
int c=~a+1;
ps:最小的负数取相反数,是它自己
随机数
01随机数
double ans1=Math.random();//返回[0,1)上的随机数
int ans2=(int)(Math.random()*k);//[0,k-1]范围上的等概率整数
题:任意x(x在0,1区间) 返回[0,x)数的概率为x^2
return Math.Max(Math.random(),Math.random());//概率论知识,两次独立事件,最大结果小于x
0N随机数再随机–01发生器
题:F()函数等概率得到1-5的随机数,怎么得到1-7等概率随机数
解:
第一步,改成01等概率。例如12返回0,45返回1,3重试
第二步,1-7转换成0-6,至少需要3个二进制位
第三步,遗弃超出6的结果,只保留0-6部分
数组
如果时间复杂度会比较高的话,不如先排个序。
三数之和
排序算法
快速排序的改写
215. 数组中的第K个最大元素
二分及其扩展
KMP
某个String,把前面一部分剪切到后面去。例如123456变为456123。
解:
第一步,自己接自己:123456123456
第二步,看是不是这个拼接后字符串的子串。456123是123456123456
应用在树
二叉树2的结构,是否和二叉树1的某子树是一致的。
满足:先序遍历(null补空的位置),树2是树1的kmp子串 。用String数组来存放节点值最好
BFPRT
返回无序整数数组第K小的数 O(N)时间复杂度
解法一:用概率收敛到O(N)
类似快排,k在本次所当选出m下标范围内时结束,否则左侧或右侧再次执行。(注意:不进行真的排序)
解法二:BFPRT
跟之前的算法不同的是选择pivot,
递归 & 动态规划
贪心
链表
栈 & 队列
表 & 堆
树
图
排队问题
例:给定一个数组arr,长度为n表示arr[i]服务员的服务时间,给定一个正数m表示有m个人等位。
当m数量级不大时可以采用小根堆
当m数量级很大时可以采用二分
参考
小根堆
二分法
其他
题目:
将数组中奇数放在奇数位置,偶数放在偶数位置
解析:
a、b指针分别从开头开始,各自指向奇数或偶数位置,每次位置增加2。c指针指向最后一个位置,奇数ac交换值,偶数bc交换值。