剑指Offer
凉薄慕人
为了证明自己的价值而不断努力,但不再期待任何人的夸奖。
展开
-
38_2、字符串的组合
字符串的组合题目描述求字符的所有组合。例如输入三个字符a,b,c,则它们的组合有a,b,c,ab,ac,bc,abc.思路分析主要思路是先排序字符,每次在上次组合的基础上添加字符计算出长度增1的组合,由于字符串长度为length,则执行length-1次。代码如下public static ArrayList<String> Combination(String str) {...原创 2020-02-18 17:52:23 · 130 阅读 · 0 评论 -
13、机器人的运动范围
机器人的运动范围题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路分析利用回溯法,类似...原创 2020-02-18 15:21:07 · 70 阅读 · 0 评论 -
8、二叉树的下一个节点
二叉树的下一个节点题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路分析分三种情况考虑。1、若该节点存在右子树,则下一节点为右子树最左边的节点。2、该节点不存在右子树,若该节点为父节点的左节点,则该父节点为该节点的下一节点。3、若该节点为其父节点的右节点,则一直往上遍历,直至遍历节点为其父节点的...原创 2020-02-17 21:08:14 · 74 阅读 · 0 评论 -
18、删除链表的节点
删除链表中重复的节点题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路分析因为存在删除操作,所以首先考虑双指针,保留被删节点的前一个节点,另一个节点找到被删节点的后一个节点,需要注意被删节点为头结点。代码如下:...原创 2020-02-17 20:18:25 · 81 阅读 · 0 评论 -
67、把字符串转换成整数
把字符串转换成整数题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。思路分析在转换过程中需要注意正负号、是否溢出这两个问题。代码如下:public static int StrToInt(String str) { if (str==null||str.length()==0)return 0; cha...原创 2020-02-17 15:20:24 · 113 阅读 · 0 评论 -
33、二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路分析主要思路参考(https://blog.csdn.net/u013132035/article/details/80607000)代码如下:public boolean VerifySquenceOfBST(i...原创 2020-02-16 21:34:29 · 81 阅读 · 0 评论 -
9、用两个栈实现队列
用两个栈实现队列题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路分析充分理解栈先进后出的特性和队列先进先出的特性。代码如下:Stack<Integer> stack1 = new Stack<Integer>();Stack<Integer> stack2 = new Stack<Integer&...原创 2020-02-16 20:48:37 · 72 阅读 · 0 评论 -
7、重建二叉树
重建二叉树题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路分析前序遍历的确定根节点,可以根据此点分别找到左子树跟右子树的前序遍历序列和中序遍历序列,通过递归再分别构建子树的左子树和右子树。代码...原创 2020-02-16 20:25:12 · 105 阅读 · 0 评论 -
6、从尾到头打印链表
从尾到头打印链表题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路分析解法一:首先想到利用栈先进后出的特性。代码如下:public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list=new ArrayList...原创 2020-02-16 18:51:42 · 66 阅读 · 0 评论 -
5、替换空格
替换空格题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路分析从头到尾扫描字符串,每一次碰到空格的时候做替换。由于是把一个字符替换成3个字符,必须要把后面的所有字符都后移两个字节,否则就有两个字符被覆盖了。故假设字符串的长度是n,对每个空格字符,需要移动后面O(n)个字符...原创 2020-02-16 18:31:00 · 71 阅读 · 0 评论 -
4、二维数组中的查找
二维数组中的查找题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路分析首先选取数组中右上角的数字。如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则剔除这个数字所在的列;如果该数字小于要查找的数字,则剔除该数字所在的行。每一步都可以缩小查找...原创 2020-02-16 18:19:30 · 91 阅读 · 0 评论 -
53_3、数组中数值和下标相等的元素
数组中数值和下标相等的元素题目描述假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等。思路分析由数组是单调递增的,可以想到当数字大于其下标时,说明要找的元素在该元素前面,反之在该元素后面。暴力法效率较低,于是使用二分法。代码如下:public int getNu...原创 2020-02-16 17:51:40 · 111 阅读 · 0 评论 -
49、丑数
丑数题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路分析解法一:最直观的解法是从1开始逐一判断是否为丑数,直至找到第N个丑数但效率太低。代码如下:public int GetUglyNumber_Solution(int index) { i...原创 2020-02-14 19:45:39 · 278 阅读 · 0 评论 -
46、把数字翻译成字符串
把数字翻译成字符串题目描述给定一个数字,我们按照如下规则把它翻译成字符串:0翻译成“a”,1翻译成“b”……,11翻译成“l”,25翻译成“z”。一个数可能有多种翻译。请编程实现一个函数,用来计算数字有多少种不同的翻译方法。思路分析可以选一个数字或两个连续的数字(10~25)翻译成一个字符。定义f(i)f(i):从第i位数字开始的不同翻译数目1)若第i个数字和第i+1个数字拼接成的数字...原创 2020-02-14 18:11:10 · 92 阅读 · 0 评论 -
62、圆圈中最后剩下的数字
圆圈中最后剩下的数字题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这...原创 2020-02-14 17:16:32 · 88 阅读 · 0 评论 -
54、二叉搜索树的第K大节点
二叉搜索树的第K大节点题目描述给定一棵二叉搜索树,请找出其中的第k大的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路分析由于中序遍历二叉搜索树的结果是从小到大的顺序。则在对树进行中序遍历时计数,输出第K大节点。代码如下:TreeNode KthNode(TreeNode pRoot, int k){ if(pRoot==null||...原创 2020-02-14 15:51:43 · 86 阅读 · 0 评论 -
47、礼物的最大价值
礼物的最大价值题目描述在一个 m*n 的棋盘中的每一个格都放一个礼物,每个礼物都有一定的价值(价值大于0).你可以从棋盘的左上角开始拿各种里的礼物,并每次向由或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及上面个的礼物,请计算你最多能拿走多少价值的礼物?思路分析可以通过动态规划的思想实现。定义数组A,A[i][j]表示到达(i,j)时最大的礼物价值。通过公式A[i][j]=Math....原创 2020-02-14 15:30:50 · 83 阅读 · 0 评论 -
50_2、字符流中第一个不重复的字符
字符流中第一个不重复的字符题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。思路分析类似于字符串中第一个不重复的字符,不过这里直接使用一个数组,然后数组的下标就是这个字符出...原创 2020-02-14 15:11:48 · 103 阅读 · 0 评论 -
50、第一个只出现一次的字符
第一个只出现一次的字符题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)思路分析最直观的做法是暴力,用每个字符与字符串比较,直至出现第一个只出现一次的字符,很显然这样效率极低。字符串全部由字母组成,通过hashmap来记录字符及其对应的位置。代码如下:public sta...原创 2020-02-14 14:53:22 · 73 阅读 · 0 评论 -
55、二叉树的深度
二叉树的深度题目描述输入一棵二叉树的根节点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路分析解法一:二叉树的高度为左子树与右子树最大高度+1,而左子树的高度为该左子树的左子树与右子树最大高度+1。由此可以通过递归解决。代码如下:public int TreeDepth(TreeNode root) { return ...原创 2020-02-14 14:03:19 · 147 阅读 · 0 评论 -
28、对称的二叉树
对称的二叉树题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路分析通过比较二叉树的前序遍历序列和对称前序遍历序列来判断二叉树是不是对称的。代码如下:boolean isSymmetrical(TreeNode pRoot){ return judge(pRoot,pRoot);}boolean judge...原创 2020-02-14 14:02:53 · 81 阅读 · 0 评论 -
64、求1+2+3....+n
求1+2+3…+n题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路分析解法一:由公式得,1+2+3+…+n=(1+n)*n/2=(n^2+n)/2.则可以通过位运算实现,即(Math.pow(n,2)+n)>>1。代码如下:public int Sum_Solution(in...原创 2020-02-13 16:08:53 · 236 阅读 · 0 评论 -
57、和为S的数字
和为S的数字题目描述1、输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。2、小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19...原创 2020-02-13 15:54:20 · 209 阅读 · 0 评论 -
34、二叉树中和为某一值的路径
二叉树中和为某一值的路径题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路分析基于递归的先序遍历实现。代码如下:public ArrayList<ArrayList<Integer>> FindPath...原创 2020-02-13 14:54:35 · 68 阅读 · 0 评论 -
26、树的子结构
树的子结构题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路分析首先需要遍历二叉树A,在遍历过程中判断以遍历节点为子树是否包含子结构B,可以通过递归实现。代码如下:public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root2==null)return false...原创 2020-02-13 14:25:39 · 76 阅读 · 0 评论 -
61、扑克牌中的顺子
扑克牌中的顺子题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为...原创 2020-02-12 18:28:12 · 162 阅读 · 0 评论 -
37、序列化二叉树
序列化二叉树题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某...原创 2020-02-12 18:13:11 · 77 阅读 · 0 评论 -
11、旋转数组的最小数字
旋转数组的最小数字题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路分析二分法缩小寻求范围。代码如下:public int minNumberInRo...原创 2020-02-12 17:36:41 · 67 阅读 · 0 评论 -
23、链表中环的入口节点
链表中环的入口节点题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路分析解法一:首先想到利用HashSet来解决本题。当set中不包含当前节点时存进set,否则该点为环的入口节点。代码如下:public ListNode EntryNodeOfLoop(ListNode pHead){ HashSet<ListNode> set=new ...原创 2020-02-12 16:41:49 · 77 阅读 · 0 评论 -
51、数组中的逆序对
数组中的逆序对题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。思路分析解法一:首先会想到暴力法。效率很低,代码如下:public int InversePairs(int [] array) { int count=0; ...原创 2020-02-12 15:50:09 · 146 阅读 · 1 评论 -
24、反转链表
反转链表题目描述输入一个链表,反转链表后,输出新链表的表头。思路分析解法一:反转链表首先想到的是用栈实现。代码如下:public ListNode ReverseList(ListNode head) { if(head==null)return null; Stack<ListNode> node=new Stack<>(); while(he...原创 2020-02-11 19:17:36 · 70 阅读 · 0 评论 -
19、正则表达式匹配
正则表达式匹配题目描述请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路分析回溯法实现。代码如下:public boolean match(...原创 2020-02-11 18:47:22 · 115 阅读 · 0 评论 -
31、栈的压入弹出序列
栈的压入弹出序列题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路分析通过一个辅助栈模拟栈压入弹出的过程。代码如下:publi...原创 2020-02-11 17:54:47 · 82 阅读 · 0 评论 -
32、从上到下打印二叉树
从上到下打印二叉树题目描述1、从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。2、从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印,每一层打印到一行。3、之字形打印二叉树思路分析1、通过队列实现层次遍历。代码如下:public ArrayList<Integer> PrintFromTopToBottom(TreeNode root)...原创 2020-02-11 17:39:06 · 128 阅读 · 0 评论 -
21、调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路分析以空间换时间。为了保证数与数之间的相对位置不变,用两个数组分别存储奇数和偶数。代码如下:public void reOrderArray(int [] array) { ...原创 2020-02-11 16:34:46 · 66 阅读 · 0 评论 -
20、表示数值的字符串
表示数值的字符串题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路分析表示数值的字符串遵循模式A[.[B]][e|EC]或者.B[e|EC].代码如下:public boolean ...原创 2020-02-10 20:17:40 · 84 阅读 · 0 评论 -
56、数组中数字出现的次数
数组中数字出现的次数题目描述1、一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。2、在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。思路分析第1题:从头到尾依次异或数组中的每个数字,那么最终的结果就是两个只出现一次的数字的异或结果,因为其他数字都出现了两次,所以抵消了。这个结果数字的二进制至少有一位为1...原创 2020-02-10 19:41:08 · 189 阅读 · 0 评论 -
60、n个骰子的点数
n个骰子的点数题目描述把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。思路分析解法一:递归。可以先把n个骰子分为两堆:第一堆只有一个;另一堆有n-1个。单独的那个有可能出现1~6的点数。接下来问题转化成1~6的每一种点数和剩下的n-1个骰子来计算点数和。接下来把n-1个骰子仍然分成两堆:第一堆只有一个,第二堆只有n-2个。以此类推,最终递归结束...原创 2020-02-10 18:39:42 · 206 阅读 · 0 评论 -
48、最长不含重复字符的子字符串
最长不含重复字符的子字符串题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含‘a’~‘z’的字符。思路分析解法一:利用好动态规划的思想。首先定义函数f(i)表示以第i个字符为结尾的不包含重复字符的子字符串的最长长度。如果第i个字符没有出现过,那么f(i)=f(i-1)+1。如果第i个字符已经出现过,首先要计算第i个字符到上次出现的该字符...原创 2020-02-10 16:27:21 · 156 阅读 · 0 评论 -
30、包含min函数的栈
包含min函数的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路分析通过建立辅助栈用来存储当前所有元素的最小元素,每进一个元素,更新一次。如果进的元素小于辅助栈的栈顶元素,则入栈,否则复制栈顶元素再次入栈。代码如下:import java.util.Stack;public class Solution { S...原创 2020-02-10 15:09:40 · 160 阅读 · 0 评论