//获取子串下表
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();
使用 StringBuilder
对象或 StringBuffer
对象的 reverse() 方法
StringBuilder sb = new StringBuilder("abcd").reverse();
System.out.println(sb);//dcba
String转int:Integer.valueOf("345678")
//入参不能有非数字
拷贝创建数组: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);
}
文档
1047. 删除字符串中的所有相邻重复项
253. 会议室 II 使用的排序
优先队列/小根堆 PriorityQueue
//通过设置参数为比较器,创建大根堆或小根堆
PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
堆 例题
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
JZ86 在二叉树中找到两个节点的最近公共祖先
200. 岛屿数量
39. 组合总和
254. 因子的组合
490. 迷宫
1102. 得分最高的路径 DFS+二分
776. 拆分二叉搜索树
1135. 最低成本联通所有城市
1136. 并行课程
参考文档
124. 二叉树中的最大路径和
使用场景:组合、排列、子集、切割等
例题:
例题
leetcode46. 全排列
概念:发现计算过程中有重复计算部分,则把答案记下来,下次直接用。
例题:斐波那契
例题:背包问题
暴力:从左往右,依次选择要或者不要,构成递归
傻缓存:有重复分支,用n维数组缓存
DP:从n维数组找依赖
TIPS:
在还不熟悉 的时候,先暴力写出来(例如递归、BFS、DFS等),再改傻缓存,最终动态规划:例题
当出现重复点的时候可以优化
从左到右:
背包问题
leetcode1
leetcode300
leetcode309
53. 最大子数组和
122. 买卖股票的最佳时机 II顺便看看贪心
范围:例如两个人只能从数组左右选,谁选的总和最大。(先手后手问题)重点是开头如何如何、结尾如何如何
样本对应:最长公共子序列问题 例题
业务:
最长子序列应用:
leetcode
JZ59 滑动窗口的最大值
76. 最小覆盖子串
JZ85 连续子数组的最大和(二)
剑指 Offer II 016. 不含重复字符的最长子字符串
159. 至多包含两个不同字符的最长子串注意value部分存的是下标而不是个数,右指针更新下表,这样左指针就能从删除的下表开始。
340. 至多包含 K 个不同字符的最长子串
76. 最小覆盖子串
保证局部最优,使得最后出现的结果全局最优。
例题
323. 无向图中连通分量的数目
305. 岛屿数量 II
1061. 按字典序排列最小的等效字符串
548. 将数组分割成和相等的子数组
660. 移除 9
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:最小的负数取相反数,是它自己
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
题:F()函数等概率得到1-5的随机数,怎么得到1-7等概率随机数
解:
第一步,改成01等概率。例如12返回0,45返回1,3重试
第二步,1-7转换成0-6,至少需要3个二进制位
第三步,遗弃超出6的结果,只保留0-6部分
如果时间复杂度会比较高的话,不如先排个序。
三数之和
快速排序的改写
215. 数组中的第K个最大元素
某个String,把前面一部分剪切到后面去。例如123456变为456123。
解:
第一步,自己接自己:123456123456
第二步,看是不是这个拼接后字符串的子串。456123是123456123456
二叉树2的结构,是否和二叉树1的某子树是一致的。
满足:先序遍历(null补空的位置),树2是树1的kmp子串 。用String数组来存放节点值最好
返回无序整数数组第K小的数 O(N)时间复杂度
解法一:用概率收敛到O(N)
类似快排,k在本次所当选出m下标范围内时结束,否则左侧或右侧再次执行。(注意:不进行真的排序)
解法二:BFPRT
跟之前的算法不同的是选择pivot,
例:给定一个数组arr,长度为n表示arr[i]服务员的服务时间,给定一个正数m表示有m个人等位。
当m数量级不大时可以采用小根堆
当m数量级很大时可以采用二分
参考
题目:
将数组中奇数放在奇数位置,偶数放在偶数位置
解析:
a、b指针分别从开头开始,各自指向奇数或偶数位置,每次位置增加2。c指针指向最后一个位置,奇数ac交换值,偶数bc交换值。