![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
氵冫丶
这个作者很懒,什么都没留下…
展开
-
变态跳台阶
题目解题f(n)f(n)表示nn级台阶的跳法 显然: f(n)=f(n−1)+f(n−2)+f(n−3)++f(n−4)+...+f(2)+f(1)f(n)=f(n-1) + f(n-2)+ f(n-3)++ f(n-4)+...+ f(2)+ f(1) f(1)=1 f(1) = 1 f(2)=2 f(2) = 2 令: f(n−1)=f(n−2)+f(n−3)++f(n−4)+...原创 2016-06-21 00:42:41 · 361 阅读 · 0 评论 -
链表中倒数第k个结点
题目解题定义两个指针:slow、fast k是大于0的数 fast先先前走k步 k步没有结束,fast为空,说明k大于链表长度 走完k步,fast为空,说明是链表第一个结点 其他情况,fast和slow一起走 fast走到最后时候,slow.next就是倒数第k个结点/*public class ListNode { int val; ListNode next = n原创 2016-06-21 10:40:36 · 370 阅读 · 1 评论 -
反转链表
题目解题/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode head) {原创 2016-06-21 11:09:18 · 331 阅读 · 1 评论 -
合并两个排序的链表
题目解题比较,选择较小的链接/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode Merge(ListNode list1原创 2016-06-21 11:19:17 · 317 阅读 · 0 评论 -
树的子结构
题目解题子结构:B完全在A中,不要求B的叶子节点是A的叶子结点 注意: 1.B空的时候是A的子结构 2.AB都空的时候不是找到开始相等的点,完全比较 否则,左右子树比较/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeN原创 2016-06-21 12:35:14 · 384 阅读 · 0 评论 -
二叉树的镜像
题目解题方法一:递归/**/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution {原创 2016-06-21 12:46:54 · 310 阅读 · 0 评论 -
顺时针打印矩阵
题目解题顺时针打印矩阵 四个方向: 1.左上->右上 2.右上->右下 3.右下->左下 4.左下->左上import java.util.ArrayList;public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> resu原创 2016-06-21 15:24:07 · 428 阅读 · 0 评论 -
包含min函数的栈
题目解题方法一:两个栈 一个是普通操作 一个存放最小元素,栈顶始终是最小元素,新入栈元素要与栈顶元素比较后,选取较小的入栈import java.util.Stack;public class Solution { Stack<Integer> stack = new Stack<Integer>(); Stack<Integer> minStack = new Stack<In原创 2016-06-21 15:50:31 · 315 阅读 · 0 评论 -
栈的压入、弹出序列
题目解题程序中已经导入了ArrayList包,就用ArrayList,如果用栈应该更好些 模拟栈的入栈和出栈 先把pushA元素存放在ArrayList中,再对ArrayList中元素判断是否与popA中相等,相等时候就取出 最后popA元素都遍历了才是合法的栈操作import java.util.ArrayList;public class Solution { public boo原创 2016-06-21 16:16:25 · 401 阅读 · 0 评论 -
从上往下打印二叉树
题目解题层次遍历二叉树 利用队列import java.util.ArrayList;import java.util.LinkedList;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) {原创 2016-06-21 16:53:41 · 565 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目解题二叉排序树,中序遍历是升序的,利用这个性质判断 后序遍历:左右根,根据根结点的值划分出左右子树,下面递归public class Solution { public boolean VerifySquenceOfBST(int [] array) { if(array == null || array.length ==0) return f原创 2016-06-21 17:26:35 · 419 阅读 · 0 评论 -
数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题方法一:暴力public class Solution { public int InversePairs(int [] array) { if(array == null || array.length <=1) ret原创 2016-06-23 21:54:37 · 820 阅读 · 0 评论 -
数据流中的中位数
题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题剑指offer上说的很详细 1.无序数组 插入:O(1)O(1) 获取中位数:O(N)O(N)import java.util.*;public class Solution { ArrayL原创 2016-06-26 21:15:31 · 1858 阅读 · 3 评论 -
二叉树中和为某一值的路径
题目解题求根结点到叶子结点的路径,这个路径的和等于target 深度优先 这里结点有左右两个子树,故要分别对左右子树深度搜索 下面程序和前序遍历很类似,毕竟前序遍历本身就是深搜import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNod原创 2016-06-21 20:45:38 · 519 阅读 · 0 评论 -
用递归打印数字
题目用递归的方法找到从1到最大的N位整数。解题线性打印 public List<Integer> numbersByRecursion(int n) { // write your code here List<Integer> result = new ArrayList<Integer>(); int Max = (int)Math.pow(原创 2016-06-28 20:02:33 · 1234 阅读 · 0 评论 -
快速幂
题目计算an%ba^n \% b,其中a,b和n都是32位的整数。解题直接求超时class Solution { /* * @param a, b, n: 32bit integers * @return: An integer */ public int fastPower(int a, int b, int n) { // write原创 2016-06-28 20:49:41 · 1674 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目解题利用快排的思想 由于快排使得相对位置发生了变化,下面程序可以实现前面奇数后面偶数,但是数的相对位置发生了变化public class Solution { public void reOrderArray(int [] array) { int left = 0; int right = array.length-1;原创 2016-06-21 10:20:23 · 377 阅读 · 2 评论 -
数值的整数次方
题目解题之前求2n−12^{n-1}的思想可以直接利用了public class Solution { public double Power(double base, int exponent) { // 指数是 0 if(exponent==0) return 1.0; // 底数是 0 if(ba原创 2016-06-21 01:24:56 · 279 阅读 · 0 评论 -
二进制中1的个数
题目解题方法一:效率较高的方法public class Solution {public int NumberOf1(int n) { int count = 0; while(n!=0){ count ++; n &=(n-1); } return count; }}原创 2016-06-21 01:07:44 · 790 阅读 · 0 评论 -
第一个只出现一次的字符位置
题目在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始解题如:ghkdmghkddmolllpj 出现一次的字符:opj 第一个出现一次的字符:o 数组或者Hashpublic class Solution { public int FirstNotRepeatingChar(String str) {原创 2016-06-23 21:23:02 · 810 阅读 · 0 评论 -
把数组排成最小的数
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题对两个数a、b拼成一个数c c的可能只有两种:ab或者bc 题目要求拼成的数最小,选取ab、bc中最小的那个数作为答案 当有三个数的时候:a、b、c 拼接方式有六种:abc、acb、bac、bca、cab、cb原创 2016-06-23 21:10:57 · 965 阅读 · 0 评论 -
连续子数组的最大和
题目输入一个数组,数组里有正数也有负数。数组中一个或者连续的多个整数组成一个子数组,求出所有的子数组中和最大的值解题动态规划 定义:dp[i]dp[i]表示以第i个数结尾的子数组的最大和 初始值:dp[0]=A[0]dp[0]=A[0] public class Solution { public int FindGreatestSumOfSubArray(int[] array) {原创 2016-06-22 20:38:13 · 754 阅读 · 0 评论 -
最小的K个数
题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题原创 2016-06-22 20:20:57 · 860 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题原创 2016-06-22 19:38:27 · 594 阅读 · 0 评论 -
字符串的排列
题目输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题abc的排列:abc、acb、bac、bca、cab、cba 只是对不同位的字符进行了互换原创 2016-06-22 17:36:57 · 588 阅读 · 0 评论 -
替换空格
题目原创 2016-06-20 21:50:32 · 376 阅读 · 0 评论 -
二维数组中的查找
题目解题方法一:暴力 时间复杂度:O(NM)O(NM)public class Solution { public boolean Find(int [][] array,int target) { if(array == null || array.length == 0 || array[0].length == 0){ return false原创 2016-06-20 21:47:42 · 508 阅读 · 1 评论 -
从尾到头打印链表
题目解题方法一:每次在ArrayList第一个位置插入新的结点值/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/impo原创 2016-06-20 22:30:14 · 244 阅读 · 0 评论 -
重建二叉树
题目解题前序遍历:根、左、右 中序遍历:左、根、右 利用前序遍历,找到根结点,根据根结点的值在中序遍历中找到左右子树/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int原创 2016-06-20 23:15:22 · 526 阅读 · 0 评论 -
用两个栈实现队列
题目解题两个栈模拟队列 栈:先进后出 队列:先进先出 栈1存放入队列元素 栈2存放出队列元素入队列的时候: 直接如栈1出队列的时候: 当栈2非空的时候,栈2元素出栈 当栈2空的时候,栈1中元素出栈并入栈到栈2,栈1空的时候,出栈2的元素import java.util.Stack;public class Solution { Stack<Integer> stack1 = n原创 2016-06-20 23:27:09 · 331 阅读 · 0 评论 -
旋转数组的最小数字
题目解题方法一:直接线性查找 (略) 方法二:线性查找,找到第一个降序的位置,就是答案import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array) { if(array == null || array.length ==0)原创 2016-06-20 23:50:07 · 325 阅读 · 0 评论 -
斐波那契数列
题目解题方法一:递归public class Solution { public int Fibonacci(int n) { if(n <=0) return 0; if(n==1) return 1; if(n==2) return 1; return原创 2016-06-20 23:56:41 · 338 阅读 · 0 评论 -
跳台阶
题目解题f(n)f(n)表示nn级台阶的跳法 对nn级台阶,最后一次跳跃,可以跳一个台阶这时只与前面的n−1n-1个台阶的跳法有关,可以跳两个台阶,这时只与前面n−2n-2个台阶的跳法有关。 所以: f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2) f(0)=0f(0)=0 f(1)=1f(1)=1 f(2)=2f(2)=2 设置:f(0)=1f(0)=原创 2016-06-21 00:06:06 · 316 阅读 · 0 评论 -
矩形覆盖
题目解题f(n)f(n)表示种类 考虑最后一次,有下面两种情况 f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2) 费波那列数列public class Solution { public int RectCover(int target) { if(target<=0) return 0; in原创 2016-06-21 01:02:58 · 288 阅读 · 0 评论 -
在O(1)时间复杂度删除链表节点
题目给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。解题这个删除结点的方式很好 把需要删除结点的值用后面一个结点值更新 删除后面的那个结点public class Solution { /** * @param node: the node in the list should be deleted * @return:原创 2016-06-28 19:36:11 · 1698 阅读 · 0 评论 -
搜索二维矩阵II
题目写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。这个矩阵具有以下特性:每行中的整数从左到右是排序的。 每一列的整数从上到下是排序的。 在每一行或每一列中没有重复的整数。解题和判断一个数是否在这样的二维矩阵中一样,判断找到适合就结束了 这个题目有多个,找到一个的时候还要继续找,直到找完public class Solution { /** * @param原创 2016-06-28 19:31:54 · 1973 阅读 · 0 评论 -
正则表达式匹配
题目请实现一个函数用来匹配包括’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配解题字符相等,sId+1,pId+1 遇到点,sId+1,pId+1 遇到星号 表示它前面的字符原创 2016-06-25 18:55:14 · 1897 阅读 · 0 评论 -
构建乘积数组
题目给定一个数组A[0,1,...,n−1]A[0,1,...,n-1],请构建一个数组B[0,1,...,n−1]B[0,1,...,n-1],其中BB中的元素B[i]=A[0]∗A[1]∗...∗A[i−1]∗A[i+1]∗...∗A[n−1]B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。解题书上讲的很好import java.util.A原创 2016-06-25 18:26:31 · 1829 阅读 · 0 评论 -
数组中重复的数字
题目在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。解题HashMap或者数组占用空间 利用数组,A[i]表示i值出现的次数 public boolean duplicate(原创 2016-06-25 17:27:25 · 5926 阅读 · 1 评论 -
把字符串转换成整数
题目将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。解题说明:字符串可能带有正负号,可能含有非数字字符 先判断是否是数字 再判断是正负 再转换public class Solution { public int StrToInt(String str) { char[] chs = str.toCharArray(); if( !isDi原创 2016-06-25 16:40:37 · 2464 阅读 · 0 评论