剑指offer
春风一慕
这个作者很懒,什么都没留下…
展开
-
两个线程交替打印,对同一个值相加交替输出
package com.company;import java.util.*;public class Main { static class Test{ int n=0; boolean flag = false; public synchronized void firstA(){ while (flag){ try { this.wai.原创 2022-01-20 20:43:56 · 410 阅读 · 0 评论 -
最长公共子序列和最长公共子串
1、* 题目标题:* 计算两个字符串的最大公共字串的长度,字符不区分大小写。* 输入描述:输入两个字符串,分两行输入。* 输出描述:输出一个整数。* 示例:* 输入:* asdfas* werasdfaswer* 输出:6 在计算机科学中,最长公共子串问题是寻找两个或多个已知字符串最长的子串。此问题与最长公共子序列问题的区别在于子序列不必是连续的,而子串却必须是。例如:str1="123ABCD4567" str2 = "ABE12345D6"...原创 2021-12-13 14:22:58 · 491 阅读 · 0 评论 -
详解编辑距离
1. 编辑距离定义 今天我们来研究一个有趣的算法题,叫做字符串编辑距离。编辑距离研究的问题和最长公共子序列有相似之处,都是比较两个字符串之间的相似性,只是采用的标准不太相同。 先给出编辑距离的定义:设A和B是2个字符串,要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括: (1)删除一个字符(delete); (2)插入一个字符(insert); (3)将一个字符改为另一个字符(substitute)。 ...原创 2021-10-13 11:57:32 · 726 阅读 · 0 评论 -
LeetCode 322 凑零钱问题
//给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 //// 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 //// 你可以认为每种硬币的数量是无限的。 / 示例 1: //// //输入:coins = [1, 2, 5], amount = 11//输出:3 //解释:11 = 5 + 5 + 1 //// 示例 2: //// //输入:coins = [2],.原创 2021-08-03 15:52:35 · 486 阅读 · 0 评论 -
包含min函数的栈
描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数,并且调用 min函数、push函数 及 pop函数 的时间复杂度都是 O(1)push(value):将value压入栈中pop():弹出栈顶元素top():获取栈顶元素min():获取栈中最小元素思路:这题看着真是让人不明白什么意思。其实这题就是让你实现下面的四个函数,当调用他们的时候能达到该函数的功能即可,原本栈这个数据结构我们还是可以继续利用的。push()和pop()方法一眼看去,原本就是栈自原创 2021-06-27 11:13:45 · 101 阅读 · 0 评论 -
回溯算法套路详解
这篇文章是很久之前的一篇《回溯算法详解》的进阶版,之前那篇不够清楚,就不必看了,看这篇就行。把框架给你讲清楚,你会发现回溯算法问题都是一个套路。废话不多说,直接上回溯算法框架。解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,无法再做选择的条件。如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解原创 2020-12-28 18:40:44 · 224 阅读 · 0 评论 -
如何理解动态规划?
long time ago, 当我刚看到动态规划这个响亮的大名时,瞬间陷入了沉思,脑中浮想联翩,揣摩着这个算法应该很带感。查了一下维基百科(不建议你阅读)动态规划在寻找有很多重叠子问题的情况的最佳解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被储存,从简单的问题直到整个问题都被解决。因此,动态规划储存递迴时的结果,因而不会在解决同样的问题时花费时间。动态规划只能应用于有最佳子结构的问题。最佳子结构的意思是局部最佳解能决定全域最佳解(对有些问题这个要求并原创 2020-12-28 18:22:42 · 155 阅读 · 0 评论 -
[剑指offer] 矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字...原创 2019-08-07 16:03:40 · 114 阅读 · 0 评论 -
[剑指offer] 翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一翻转这些单词顺序可不在行,你能帮助他么?解题思路很简单的题...原创 2019-08-13 16:21:03 · 110 阅读 · 0 评论 -
[剑指offer] 两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解题思路方法一:寻找公共结点,即这两个链表在此结点后,后续链表都相同,都是公共部分,所以我们可以从后往前找,找到最后一个是公共结点即满足条件。由于是单向链表,我们可以借助栈来实现。/*public class ListNode { int val; ListNode next = null; ListNo...原创 2019-07-21 15:08:30 · 94 阅读 · 0 评论 -
[剑指offer] 第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1.解题思路用Hashmap,字符串中的字符作为key,出现的次数作为value。用到hashmap中的containsKey方法,判断hashmap中是否存在该key,存在则返回true,然后取到该key对应的value进行+1;不存在的...原创 2019-07-21 13:54:40 · 88 阅读 · 0 评论 -
[剑指offer] 二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路递归法。求二叉树的深度,就是求左子树、右子树的中深度最大的加上一个根节点,依此递归即可。/**public class TreeNode { int val = 0; TreeNode left = null; Tree...原创 2019-07-16 20:51:06 · 89 阅读 · 0 评论 -
【递归1】汉诺塔
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。后来,这个传说就演变为汉诺塔游戏,玩法如下:1.有三根杆子A,B,C。A杆上有若干碟子 2.每次移动一块...原创 2019-09-14 14:07:32 · 648 阅读 · 0 评论 -
删除链表中重复的节点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路:首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况 设置 pre,p指针, pre指针指向当前确定不重复的那个节点,而p指针相当于工作指针...原创 2019-07-03 19:58:37 · 83 阅读 · 0 评论 -
[剑指offer] 把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路先将数组转换成字符串数组,然后对字符串数组按照规则排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则:若ab > ba 则 a > b 若ab < ba ...原创 2019-08-19 11:24:50 · 132 阅读 · 0 评论 -
把字符串转换成整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0思路:1、用str.trim()方法去掉前后空...原创 2019-08-09 20:07:23 · 896 阅读 · 0 评论 -
[剑指offer] 丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路:1、首先,是想把每个数都除以2、除以3、除以5试试,要是都除尽了,那它就是丑数。这个方法复杂度太高,AC不了,但是可行。public class Solution { pub...原创 2019-08-25 14:56:09 · 92 阅读 · 1 评论 -
链表中环的入口结点
此题经常会在面试笔试题中出现。现总结一下。题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解析:1、首先能想到的方法是,记录走过的结点,当有环时,环的入口就是第一个被重复记录的结点。我们可以用HashSet来完成。但此方法经常会被诟病,虽然时间复杂度是O(n),但空间复杂度也是O(n)。import java.util.*;/* pu...原创 2019-08-27 10:05:29 · 95 阅读 · 0 评论 -
最小路径和
目录最小路径和最小路径和 LeetCode 64给定一个包含非负整数的 mxn网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。解析:使用动态规划的解法,创建一个二...原创 2019-09-14 10:22:31 · 139 阅读 · 0 评论 -
【递归2】打印一个字符串的全部子序列,包括空字符串
字符串的全部子序列,假设字符串是"abc",那么输出“ ”,“a”,"b"等等那么起始是“空”串,遇到a两个选择,选或者不选,然后继续遇到b.......package com.example.demo;public class test1 { public static void test(String s,int i,String res){ if(i...原创 2019-09-14 15:25:00 · 321 阅读 · 0 评论 -
【递归3】全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]思路:固定一个数字,用for循环来调换其他数字,同时递归的来变换固定的数字。class Solution { public List<List...原创 2019-09-14 21:07:07 · 405 阅读 · 0 评论 -
LeetCode144 二叉树的前序遍历
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } *///递归:class Solution {...原创 2019-09-30 10:42:04 · 117 阅读 · 0 评论 -
[剑指offer] 反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路:反转两个节点,要循环两次才能把第一第二节点反转链接,head指向第三个节点,返回pre。public class ListNode{ int = val; ListNode next=null; ListNode(int val){ this.val=val; }}pub...原创 2018-12-16 16:01:57 · 70 阅读 · 0 评论 -
连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...原创 2019-07-02 22:25:38 · 86 阅读 · 0 评论 -
最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路用冒泡排序的思想,但是最外层只排序K次import java.util.*;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solutio...原创 2019-07-02 21:49:51 · 67 阅读 · 0 评论 -
[剑指offer] 二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路: 如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0...原创 2019-02-24 10:54:38 · 116 阅读 · 0 评论 -
剑指offer 跳台阶,变态跳台阶,矩形覆盖
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:台阶数:1,2,3,4,5 跳法:1,2,3,5,8显然的菲波那切数列答题思路如果只有1级台阶,那显然只有一种跳法 如果有2级台阶,那么就有2种跳法,一种是分2次跳。每次跳1级,另一种就是一次跳2级 如果台阶级数大...原创 2019-02-23 13:49:54 · 95 阅读 · 0 评论 -
[剑指offer] 重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路我们知道,前序遍历的第一个节点就是树的根节点,所以我们先根据前序遍历序列的第一个数字创建根结点,接下来在中序遍历序列中找到根结点的位置,...原创 2019-02-16 21:17:46 · 95 阅读 · 0 评论 -
Java反转字符串
编写一个函数,其作用是将输入的字符串反转过来。class Solution{ public String reverseString(String s){ return new StringBuffer(s).reverse().toString(); }} //字符串转成数组,toCharArray() // char[...原创 2018-12-22 20:57:53 · 277 阅读 · 0 评论 -
冒泡排序、快速排序
冒泡排序:class Untitled { public static void bubbleSort(int a[]){ for(int i=0;i<a.length;i++){ for(int j=0;j<a.length-i-1;j++){ if(a[j]>a[j+1]){ int temp=a[j]; a[j]=a[j+1];...原创 2019-08-09 23:08:46 · 150 阅读 · 0 评论 -
[剑指offer] 斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路公式:f(n) = n, n <= 1f(n) = f(n-1) + f(n-2), n > 1递归方法 public class Solution { public int Fibonacci(int n) {...原创 2018-12-16 14:35:12 · 112 阅读 · 0 评论 -
[剑指offer] 用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路两个栈 stack1 和 stack2:push 动作都在 stack1 中进行, pop 动作在 stack2 中进行。当 stack2 不为空时,直接 pop,当 stack2 为空时,先把 stack1 中的元素 pop 出来,push 到 stack2 中,再从 stack...原创 2018-12-20 22:10:46 · 70 阅读 · 0 评论 -
[剑指offer] 从尾到头打印链表(Java)
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。思路:从头到尾把值输入到栈里面,然后出栈;或者用递归的方法;或者Collections的reverse()反转list值public class ListNode{ int val; ListNode next=null; ListNode(int val) { this....原创 2018-12-05 14:15:57 · 98 阅读 · 0 评论 -
[剑指offer] 替换空格(Java)
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:从后往前遍历字符串,再用StringBuffer的reverse()方法反转字符串。记住字符串是用 str.charAt(i)通过索引取到值的public class Solution{ public ...原创 2018-12-05 13:20:40 · 167 阅读 · 0 评论 -
[剑指offer] 数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路指数为负时,可以先对指数求绝对值,算出次方的结果后再取倒数 当底数为0,指数为负时,会出现对0求倒数情况,要特殊处理 0的0次方在数学上没有意义,因此无论输出0还是1都是可以接受的public class Solution { public do...原创 2019-02-24 12:43:13 · 74 阅读 · 0 评论 -
[剑指offer] 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:最简单的方法就是把奇数和偶数按顺序挑出来,分别放到ArrayList里,最后再把偶数的ArrayList接到奇数ArrayList的末尾。import java.util.List;import...原创 2019-02-24 13:41:52 · 79 阅读 · 0 评论 -
[剑指offer] 旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路:我最先想到的就是用for循环来遍历了,但是看起来比较low,所以还可以用二分查找法。impo...原创 2019-02-20 18:53:33 · 71 阅读 · 0 评论 -
[剑指offer] 对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路法一:递归。根节点的左右子树相同,左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同即可。法二:非递归。非递归也是一样,采用栈或队列存取各级子树根节点。法一:递归。/*public class TreeNode { in...原创 2019-07-01 21:58:16 · 112 阅读 · 0 评论 -
[剑指offer] 二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路二叉搜索树: 左子树<根<=右子树对于后序遍历来说,序列数组的最后一个元素一定是根节点, 根据这个元素,将前面的数组分为左、右两个部分,左侧部分都比该元素小,右侧部分都比该元素大,如果右侧部分有比该根节点小的元素,...原创 2019-05-16 17:12:14 · 74 阅读 · 0 评论 -
[剑指offer] 从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路就是二叉树的层序遍历。借助一个队列就可以实现。使用两个队列一个存放节点,一个存放值。先将根节点加入到队列中,然后遍历队列中的元素,遍历过程中,访问该元素的左右节点,再将左右子节点加入到队列中来。注意Queue创建的方式:Queue<TreeNode> queue = new LinkedList<...原创 2019-05-15 21:41:00 · 76 阅读 · 0 评论