目录
不同子串
辗转相除法-求最大公约数
二叉树非递归前序遍历
不同子串
从a开始,截取 a aa aaa aaab
从第二个下标开始a aa aab
从第三个 a ab
从第四个 b
使用set的唯一性,然后暴力遍历来去去重,从第一个下标开始截取aaab
a aa aaa aaab
a aa aab
..
从下标0截取的范围[0,最大下标]
第二个下标截取的范围[1,最大下标]
(知道循环次数使用for ,不知道使用while)
subString(i,j)从i开始,截取j个字串
sub的双重循环中,结束位置一定是要恒大于i,所以j是大于i的,然后比i多,但是此时是等于i然后去+1,(那么假如说是j=i+1会怎么样呢,那么<a.length(),就应该变成<=)
public static void main(String[] args) { Scanner scanner=new Scanner(System.in); String a=scanner.nextLine(); HashSet<Object> ret=new HashSet<>(); for(int i=0;i<a.length();i++){ for(int j=i;j<a.length();j++){ ret.add(a.substring(i,j+1)); } } System.out.println(ret.size()); }
辗转相除法-求最大公约数
两个整数的最大公约数,等于其中较小的数和两数相除余数的最大公约数。
gcd(a,b)=acd(b,a%b) a>b
比如12和4的最大公约数=4%0最大公约数。当b值变成0的时候,a就是要求的最大公约数=4
再比如 10和7的最大公约数:7%3->3%4->3%1->1%0
如果没学递归,我会使用循环,可是我学了递归,确实装波一利器。
public static int x(int big,int small){ if(big<small){ int tmp=big; big=small; small=big; } if(small==0){ return big; } int ret=x(small,big%small); return ret; } public static void main(String[] args) { System.out.println(x(27,9)); }
动态规划
最长增长子序列
最小距离(路径) -数字三角形
背包问题
凑零钱
核心思想:拆分子问题,记住过程,减少重叠的子运算
再简单回顾一下
二叉树非递归前序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ret=new LinkedList<>();
if(root==null) return ret ;
Stack<TreeNode> stack=new Stack<>();
TreeNode cur=root;
while(!stack.isEmpty()||cur!=null){
while(cur!=null){
stack.push(cur);
ret.add(cur.val);
cur=cur.left;
}
TreeNode top=stack.pop();
cur=top.right;
}
return ret;
}
}