剑指offer
文章平均质量分 65
ijbuhv
这个作者很懒,什么都没留下…
展开
-
链表中环的入口
一个链表中包含环,请找出该链表的环的入口结点。方法一:直接Set存下所有节点,从链表头开始遍历,第一个重复节点即为入口节点import java.util.HashSet;import java.util.Set;/* public class ListNode { int val; ListNode next = null; ListNode(int v原创 2017-02-22 16:49:46 · 257 阅读 · 0 评论 -
约瑟夫环
给一个长度为n的环,从编号为0的节点开始数,数到m-1时移除该节点,问最终剩下节点的编号方法一:直接模拟链表移除import java.util.LinkedList;import java.util.List;public class Solution { public int LastRemaining_Solution(int n, int m) { if(m原创 2017-02-20 14:24:23 · 641 阅读 · 0 评论 -
数组中只出现一次的数
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。方法一:直接用map存下次数就行//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;impor原创 2017-01-13 12:03:54 · 207 阅读 · 0 评论 -
判断是否为平衡二叉树
输入一棵二叉树,判断该二叉树是否是平衡二叉树。dfs,判断这棵树的左右子树的高度差是否大于1public class Solution { private boolean flag = true ; public boolean IsBalanced_Solution(TreeNode root) { flag = true ;原创 2017-01-13 11:13:16 · 232 阅读 · 0 评论 -
二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。用bfs搜索/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {原创 2017-01-13 10:05:47 · 176 阅读 · 0 评论 -
数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。用两个二分,第一个二分找到这个数字在数组中的起点,第二个找到对应的终点,直接减去就行public class Solution { public int GetNumberOfK(int [] array , int k) { int left = 0 ; int right = array.length-1 ;原创 2017-01-13 09:58:00 · 161 阅读 · 0 评论 -
两个链表的第一个节点
输入两个链表,找出它们的第一个公共结点。解法1:遍历链表1,用set存下,然后遍历链表2,找出第一个set中有的节点/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import jav原创 2017-01-12 23:51:09 · 418 阅读 · 0 评论 -
和为S的两个数
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的方法一:直接用map存下所有数,用一个数,看map中是否有另外一个数import java.util.ArrayList;import java.util.HashMap;import java.util.Map; public class Solution原创 2017-01-13 16:02:32 · 232 阅读 · 0 评论 -
和为s的连续正序列
找出和为S的所有连续序列,序列的长度大于1,如100的对应的序列为(18,19,20,21,22)计算连续数组的的公式为S=a*i*(i+1)/2;其中i为这个等差数列的个数,a为这个等差数列那么可以遍历等差数列的个数,看有没有整数首项import java.util.ArrayList;public class Solution { public ArrayList > Fi原创 2017-01-13 15:29:17 · 203 阅读 · 0 评论 -
丑数
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。最后一个乘2,乘3,乘5的最小值,dp求解import java.util.List; import java.util.ArrayList ;public class Solution {原创 2016-12-25 20:03:29 · 235 阅读 · 0 评论 -
不用加减乘除的加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。首先通过将两个数字异或求出不进位的每位数的位置,然后通过将两个数进行与操作后向左移以为,计算进位后的操作重复上述操作直到没有进位public class Solution { public int Add(int num1,int num2) { while(num2 != 0原创 2017-02-20 16:20:02 · 314 阅读 · 0 评论 -
数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。方法一:直接用Map处理import java.util.HashMap;import java.util.Map;原创 2017-02-20 18:29:47 · 192 阅读 · 0 评论 -
二叉搜索树的第k个节点
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。递归搜索/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(in原创 2017-02-21 19:44:07 · 230 阅读 · 0 评论 -
数据流的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。维护一个大根堆和一个小根堆,大根堆中的所有数都小于小根堆的所有数,大根堆和小根堆各占所有数的一半import java.util.Comparator;import java.util.Priorit原创 2017-02-21 19:16:32 · 253 阅读 · 0 评论 -
二叉搜索树和双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。对这棵二叉搜索树中序遍历,然后修改指针并将双链表的头指针返回,然后合并左边双链表,根节点,右边双链表/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right原创 2017-02-21 16:11:29 · 283 阅读 · 0 评论 -
滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1},原创 2017-02-21 14:09:53 · 475 阅读 · 0 评论 -
矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如[a b c e s f c s a d e e]是3*4矩阵,其包含字符串"bcced"的路径,但是矩阵中不包含“abcb”路径,因为字符串的第一个字符b占据了矩原创 2017-02-21 11:29:56 · 270 阅读 · 0 评论 -
机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?直接用bfs从(0,0)位置开始搜索import原创 2017-02-21 11:07:40 · 435 阅读 · 0 评论 -
对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。递归遍历判断/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {原创 2017-02-20 21:25:29 · 216 阅读 · 0 评论 -
表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。直接遍历判断public class Solution { public boolean isNumeric(char[] str)原创 2017-02-20 21:05:31 · 370 阅读 · 0 评论 -
模拟正则表达式匹配
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配递归模拟,当pattern数组中下一个为'*',则递归枚举是匹配到原串的哪个位置public原创 2017-02-20 20:32:16 · 685 阅读 · 0 评论 -
构建乘积数组
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。记录一个到当前位置的左边的乘积数组和其右边的乘积数组相乘就行public class Solution { public int[] multiply(int[] A) {原创 2017-02-20 18:47:35 · 287 阅读 · 0 评论 -
把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。将数字装换为字符串,修改比较条件为两个字符串连接和的值那个小在前面import java.util.ArrayList;import java.util.Collections ; import java.原创 2016-12-25 18:54:41 · 189 阅读 · 0 评论 -
连续子数组的最大和
给定一个序列,求其子序列中的最大和,序列长度最少为1dp[i]子序列的尾端是第i个数的最大子序列长度public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length == 0) return 0 ; int [] dp = new原创 2016-12-25 18:16:42 · 217 阅读 · 0 评论 -
最小的k个数
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。维护一个大小为k的大根堆,每次新进一个数就让其与根节点比较,如果其小于根节点,则将其替换掉根节点,调整大根堆,以此往复.原创 2016-12-25 18:09:42 · 166 阅读 · 0 评论 -
链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个结点。维护两个指针,这两个指针之间相距k个节点,当前面的节点走到尾时,后面的节点则为倒数第k个节点/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/原创 2016-12-24 15:48:25 · 231 阅读 · 0 评论 -
数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。直接快速幂计算\public class Solution { public double Power(double base, int exponent) { double ans = 1.0; boolean flag = false ; if(exp原创 2016-12-24 15:42:19 · 173 阅读 · 0 评论 -
二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 直接将这个整数用数组表示,然后找到对应的1的个数 public class Solution {public int NumberOf1(int n) { int[] a = new int[50] ; boolean flag = false; if(n < 0){ n = -n ;原创 2016-12-24 15:34:03 · 179 阅读 · 0 评论 -
斐波那契数列相关
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39public class Solution { public int Fibonacci(int n) { int[] dp = {0,1} ; if(n < 2)return dp[n] ; for(int i = 2;i <= n;i++){原创 2016-12-24 15:00:15 · 269 阅读 · 0 评论 -
旋转数组的最小值
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。数组中最小数的左边数都大于等于它并且递增,数组中最小数的右边的数都小于等于它并且递减import java.util.ArrayList;public class So原创 2016-12-24 14:47:19 · 210 阅读 · 0 评论 -
用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作 一个在push时stack1添加数据,在pop时出另一个栈stack2出数据,当stack2空时将stack1中的数据加到stack2中import java.util.Stack;public class Solution { Stack stack1 = new Stack(); Stack stack原创 2016-12-24 14:21:18 · 274 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。方法一:通过一个map记录中序数组中每个节点在数组中的位置,然后递归遍历前序数组,在中序数组中找到前序数组的位置,然后判定当前节点在中序遍历数组的根的位原创 2016-12-24 14:06:03 · 173 阅读 · 0 评论 -
从尾到头打印链表
/** * 输入一个链表,从尾到头打印链表每个节点的值 *//** * 通过递归方法解决 */import java.util.ArrayList;public class PrintListFromTailToHead { private ArrayList list = new ArrayList<>() ; public class ListNode { int原创 2016-12-24 13:12:17 · 162 阅读 · 0 评论 -
替换空格
/** * 请实现一个函数,将一个字符串中的空格替换成“%20”。 * 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy */public class ReplaceSpace { public String replaceSpace(StringBuffer str) { int num = 0 ; for(int i =原创 2016-12-24 12:57:28 · 179 阅读 · 0 评论 -
二维数组中的查找
/** * 在一个二维数组中, * 每一行都按照从左到右递增的顺序排序, * 每一列都按照从上到下递增的顺序排序。 * 请完成一个函数,输入这样的一个二维数组和一个整数 * 判断数组中是否含有该整数。 */import java.util.Arrays;public class find { /** * 方法二:从左下角开始遍历,如果当前数比target小,则向右移动,如果当原创 2016-12-24 12:37:38 · 187 阅读 · 0 评论 -
反转链表
输入一个链表,反转链表后,输出链表的所有元素。通过递归的方式修改指针/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode原创 2016-12-24 16:08:06 · 168 阅读 · 0 评论 -
合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution {原创 2016-12-24 16:18:25 · 203 阅读 · 0 评论 -
数组中出现次数超过一半的数
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。直接用hashmap o(n)即可求得import java.util.HashMap;import java.util.Map;import java.util.Map.原创 2016-12-25 16:19:49 · 253 阅读 · 0 评论 -
字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。先将原字符串按照字典序排列,直接用dfs实现全排列,然后去重import java.util.ArrayList;import java.util.Arrays;import java.util.Collec原创 2016-12-25 16:04:45 · 228 阅读 · 0 评论 -
复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。将原来的链表的每个节点都复制到其后面的那个节点,然后将复制节点的random指针指向原来节点的random.next就行,然后从这个链表中分离出两个链表/*public class RandomListNode { int label; Ra原创 2016-12-25 15:54:37 · 311 阅读 · 0 评论