算法刷题
大厂面试还是很注重算法题的,尤其是字节跳动,算法是问的比较多的,关于算法,推荐《LeetCode》和《算法的乐趣》,这两本我也有电子版,字节跳动、阿里、美团等大厂面试题(含答案+解析)、学习笔记、Xmind思维导图均可以分享给大家学习。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
写在最后
最后,对所以做Java的朋友提几点建议,也是我的个人心得:
-
疯狂编程
-
学习效果可视化
-
写博客
-
阅读优秀代码
-
心态调整
fun(set,str.toCharArray(),0); re.addAll(set);//将出现的字符串保存在list集合中 Collections.sort(re); return re; }
static void fun(HashSet re,char[] str, int k){
if(k==str.length){
re.add(new String(str));
return;
}
for(int i=k;i<str.length;i++){//在for循环中,第一次初始化,然后判断,执行for循环体。执行完后i+1,在判断(初始化只执行一次)
swap(str,i,k);
fun(re,str,k+1);
swap(str,i,k);//防止元素的重复,进行复原
}
}
//将数组中的两个数进行交换
static void swap(char[] str,int i,int j){
if(i!=j){//相同就不用交换了
char t=str[i];
str[i]=str[j];
str[j]=t;
}
}
}
### 二进制数中1的个数(用与运算)
static int NumberOf3(int n) {
int count=0;
while(n!=0){//整数不为0,必有1
++count;
n=n&(n-1);
}
return count;
}
### 反转二叉树(就是二叉树的镜像)
public void Mirror(TreeNode root) {
if(rootnull) {//为空结点
return;
}
if(root.leftnull&&root.right==null){//表明该结点是叶子节点或只是根为的节点
return;
}
//交换当前节点的左右子树
TreeNode temp;
temp=root.left;
root.left=root.right;
root.right=temp;
if(root.left!=null){
Mirror(root.left);
}
if(root.right!=null){
Mirror(root.right);
}
}
### 通过前序、中序,重建二叉树
/**
* 解题的步骤:
* 1:递归的结束条件,只有到叶子节点,递归才结束(preStartpreEnd&&inStartinEnd)
* 2:在中序中找到根,通过根算出左子树的长度,右子树的长度(左右子树各有多少个节点)
* 3:通过左子树的长度,算出前序左子树的起始节点(preStart+1,preStart+leftTree),中序左子树的起始节点(inStart,root-1),递归前提条件是leftLength>0(若为0,那就是叶子节点了)
* 4:同上算出右子树的递归
*/
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(prenull||innull){//只要一个为空,另一个必为
return null;
}
TreeNode root=binaryTree(pre,in,0,pre.length-1,0,in.length-1);
return root;
}
public TreeNode binaryTree(int[] pre,int[] in,int preStart,int preEnd,int inStart,int inEnd){
//构造一个结点
TreeNode node=new TreeNode(pre[preStart]);
node.left=null;
node.right=null;
//现在要想想递归的结束条件是什么,preStart=preEnd和inStart=inEnd,表明这是一个叶子节点
if(preStartpreEnd&&inStartinEnd){
return node;
}
//现在要找出根节点
int root=0;
//肯定在in数组中找了
for(int i=inStart;i<in.length;i++){
if(pre[preStart]==in[i]){
root=i;
break;
}
}
//找到根节点,就得算出左右子树的长度(肯定是通过in数组)
int leftTree=root-inStart;//要去掉根节点即第一个节点
int rightTree=inEnd-root;
if(leftTree>0){
node.left=binaryTree(pre,in,preStart+1,preStart+leftTree,inStart,root-1);
}
if(rightTree>0){
node.right=binaryTree(pre, in, preStart+leftTree+1, preEnd, root+1, inEnd);
}
return node;
}
}
### 结尾
学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**
高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
![html5](https://img-blog.csdnimg.cn/img_convert/d35c2cf2d5364b4907e65f1856c923a4.png)