
面试算法题
悲伤的小霉
If not me,who?;If not now,when?
展开
-
整数拆分,减绳子(动态规划)
题目描述: 剑指Offer的减绳子和LeetCode的整数拆分都是这种类型的题,我感觉挺难的,看了好久题解,才迷迷糊糊懂点。唉,太菜了。 public static int cutRope(int target){ //特殊的情况 if(target<=3) return target-1; int[] dp=new int[target+1]; dp[1]=1; dp[2]=2;原创 2020-07-27 21:32:36 · 136 阅读 · 0 评论 -
剑指Offer——矩阵中的路径(dfs剪枝,回溯)
题目描述: 你不刷题,面试官就刷你。 解题思路 1、牛客和LeetCode上面都有,方法传入的参数不太一样,但解法都一样,自己没想出来,做这类dfs的题目少,看了大佬们的解法,自己也能写出来了。总结一下。 深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。 剪枝: 在搜索中,遇到 这条路不可能和目标字符串匹配成功 的情况(例如:此矩阵元素和目标字符不同、此元素已被访问),则应立即返回,称之为可行性剪枝。 写原创 2020-07-24 23:32:53 · 151 阅读 · 0 评论 -
剑指Offer——从上往下打印二叉树
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 解题思路: 这种题,已经不在话下了,直接利用队列,层次遍历。唯一需要注意的地方就是判断为空的时候返回一个空ArrayList。easy~~~ 参考代码: public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { if(root==null) return new ArrayList();原创 2020-07-24 20:54:03 · 115 阅读 · 0 评论 -
剑指Offer——对称二叉树(三次优化)
题目描述: 请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 解题思路: 1、一开始我使用的方法,是层次遍历,存入列表中,遍历的时候左右子树顺序交换一下,然后得到两个List集合,对比。但是这样没考虑子树为空的情况,导致虽然不符合题目要求,但是还是错误判断成了符合。 2、另一种方法,是比较两棵树是不是相同,一个树是复制它本身,另一个树是这个树本身的镜像。 这里有三个常见的用法: 复制本身 //复制二叉树 public Tree原创 2020-07-22 10:23:00 · 133 阅读 · 0 评论 -
剑指Offer——数值的整数次方(快速幂)
数值的整数次方: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 解题思路: 这道题复习快速幂算法。注意处理exponent为负数的情况。 参考代码: public static double Power2(double base, int exponent) { double d=1; boolean flag=false; if(exponent&l原创 2020-07-18 09:00:46 · 108 阅读 · 0 评论 -
Java Thread 中 run() 与 start() 的区别
参考文章 Java Thread 中 run() 与 start() 的区别 Java 的线程是通过 java.lang.Thread 类来实现的。VM 启动时会有一个由主方法所定义的线程。可以通过创建 Thread 的实例来创建新的线程。每个线程都是通过某个特定 Thread 对象所对应的方法 run() 来完成其操作的,方法 run() 称为线程体。通过调用 Thread 类的 start() 方法来启动一个线程。 在 Java 当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。 第一是创建状原创 2020-07-17 23:01:35 · 182 阅读 · 0 评论 -
剑指Offer——二叉树的镜像
题目描述: 操作给定的二叉树,将其变换为源二叉树的镜像。 解题思路: 1、方法一:利用递归,交换左右子树节点,调用递归。时间复杂度:O(n),空间复杂度:O(n) 2、方法二:可能出题会限制,不让用递归的方法,那么可以将二叉树遍历一遍,然后利用中间变量交换左右子树节点。我运用的是利用二叉树的广度优先搜索。时间复杂度:O(n),空间复杂度:O(n) 参考代码: public class TreeNode { int val = 0; TreeNode left = n原创 2020-07-17 08:45:38 · 116 阅读 · 0 评论 -
剑指Offer——二叉树的下一个结点
题目描述: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 解题思路: 首先,先复习下,二叉树的中序遍历:中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。如图所示二叉树:中序遍历的结果为:{D,B,H,E,I,A,F,C,G} 这道题需要分情况讨论: 1、 如果一个节点有右子树的时候,那么它的下一个节点就是它的右子树中的最左子节点。(比如说b的下一个节点是h) 2、 如果一个节点没有右子树的时候,并且节点是它的原创 2020-07-17 00:47:18 · 180 阅读 · 0 评论 -
剑指Offer——把二叉树打印成多行(队列)
题目描述: 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 解题思路: 参考链接:队列 先了解一下队列的知识: 队列是一种常用数据结构,有先入先出的性质。 java中用Queue来表示队列。Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接口。 常用方法: add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并原创 2020-07-16 00:23:10 · 170 阅读 · 0 评论 -
剑指Offer——跳台阶
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 解题思路: 1、经典的递归思想,简单版本的青蛙跳 2、可以这样思考,当还剩最后两个台阶的时候,青蛙有2种跳到终点的方法,当还剩一个台阶的时候,有一种跳法。一种递归的下探,类似于老大给小弟分配事情。时间复杂度O(2^n),还可以优化。 参考代码: public class Solution { public int JumpFloor(int target) {原创 2020-07-14 23:30:26 · 155 阅读 · 0 评论 -
剑指Offer——左旋转字符串
题目: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! 解题思路: 1、我第一次的方法是放入char中,然后根据n重新组装新的字符串,但是没有考虑到""空字符串的情况,而且在使用String.valueOf()的时候,没有忽略多余的空格,这里应该用,String.va原创 2020-07-14 23:21:24 · 159 阅读 · 0 评论 -
剑指Offer——斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。 n<=39 解题思路: 1、简单题,这里分析一下多种方法的时间复杂度。总结了常用的三种方法。 2、第一种是利用递归。时间复杂度:O(2^n)。 3、优化后的方法,利用数组,存储的方法,时间复杂度:O(n),空间复杂度:O(n) 4、在优化,不需要的不存储,直接利用一层for循环找到n项的值。 参考代码: public int Fibonacci(int n) {原创 2020-07-06 16:07:31 · 207 阅读 · 0 评论 -
剑指Offer——数组中只出现一次的数字
题目描述: 数组中只出现一次的数字: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 解题思路: 1、水题,总结两种方法。 2、第一种就是利用数组下标的方法,简单利于理解。 3、第二种方法是用HashMap的方法。 参考代码: import java.util.Arrays; import java.util.HashMap; public class t_3 { public void FindNumsAppearOnce(int [] arra原创 2020-07-04 09:42:35 · 3823 阅读 · 0 评论 -
剑指Offer——求1+2+3+...+n
题目描述: 求1+2+3+…+n: 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 解题思路: 1、这道题如果不加限制条件,很多方法可以做,直接利用公式,循环,递归都可以。但是加了条件就需要用其他方法了。 2、第一种方法是,利用位运算符,代替原来递归调用的if语句,达到判断的目的,短路求值的思想。 3、第二种方法是,利用java的捕捉异常机制,达到重复调用的终止条件。 参考代码 public class t_1 {原创 2020-07-02 23:19:26 · 223 阅读 · 0 评论 -
剑指Offer——翻转单词顺序列
题目描述 翻转单词顺序列: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 解题思路: 这个题目不算难,做法是用split分割数组,然后再组装成新的字符串即可。这道题我卡了一会,因为一个细节没有原创 2020-07-01 23:16:08 · 141 阅读 · 0 评论 -
剑指Offer——变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 解题思路 1、这道题有规律可循,当n等于0或者1的时候,跳法都只有1种。如果是n级的话,假设方法有f[n]种,那么当n-1级的时候,假设方法有f[n-1]种方法,当n-2级的时候,有f[n-2]种方法,依此类推,我们可以得到一个关系式f[n] = f[n-1] + f[n-2] + … + f[0];f[n-1] = f[n-2] + f[n-3] + … + f[0],将这两个式子化简原创 2020-06-29 23:51:06 · 110 阅读 · 0 评论 -
剑指Offer——二叉树的深度
题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 解题思路 这道题可以利用递归的思想: 1、只有一个根节点,深度为1; 2、如果根节点只有一颗子树,深度为子树+1。 3、如果根节点有两颗子树,深度就为两颗子树深度大的+1; 参考代码 递归结束的条件就是当树为空的时候。 /** public class TreeNode { int val = 0; TreeNode left = null; TreeN原创 2020-06-29 10:05:54 · 164 阅读 · 0 评论 -
剑指Offer——不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 解题思路 1、这道题其实就是利用数字的位运算代替求出加法,但是我再做第一遍的时候用了另一种方法。我直接把两个数字换成了BigInteger的类型,然后通过Add方法实现了。 2、位运算的方法就是:1、两个二进制数异或相当于不考虑进位的加法,2、然后两个二进制数相与在左移一位,相对于求进位,然后不断的重复这两个步骤,最后当进位等于0的时候就得到了最终的答案。 3、例如5和7 二进制分别是0101和0111重复上述两个步骤原创 2020-06-28 00:02:23 · 150 阅读 · 0 评论