![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer解题
练习编程题
inferno devil
这个作者很懒,什么都没留下…
展开
-
求斐波那契数列的第n项
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39。解题思路:我们可以发现每次就用到了最近的两个数,所以我们可以只存储最近的两个数 sum 存储第 n 项的值 one 存储第 n-2项的值 two 存储第 n-1 项的值代码:public class Solution { public int Fibonacci(int n) { if(n == 0){原创 2020-09-26 18:56:36 · 1364 阅读 · 0 评论 -
数组的旋转——把一个数组最开始的若干个元素搬到数组的末尾
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路:3 4 5 1 2 (一般情况)1 2 3 4 5 / 2 2 2 2 2(容易想到的点)1 0 1 1 1 / 1 1 1 0 1(扑街)既然是排序后的数组,虽然经过了旋转,但是直觉还是告诉我要使用二原创 2020-09-26 18:38:23 · 1082 阅读 · 0 评论 -
用两个栈来实现一个队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路:push操作就直接往stack1中push。 pop操作需要分类一下:如果stack2为空,那么需要将stack1中的数据转移到stack2中,然后在对stack2进行pop, 如果stack2不为空,直接pop就ok。代码:import java.util.Stack;public class Solution { Stack<Integer> stac原创 2020-09-26 16:53:37 · 217 阅读 · 0 评论 -
在O(n log n)的时间内 使用常数级空间复杂度 对链表进行排序。
题目描述:在O(n log n)的时间内使用常数级空间复杂度对链表进行排序。示例:解题思路:归并排序运用在链表上(由于链表不能索引访问,故快排桶排并不合适),拆链表使用:快慢指针里面的几个步骤都是难点: 1.自底向上思想; 2.断链 3.归并 4.合链代码:import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public cla原创 2020-09-25 19:17:41 · 318 阅读 · 0 评论 -
对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
题目描述:对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上示例:解题思路:方法一: 斜率相同的点在同一直线上。 相同位置的点也在同一直线上。 最多能有多少个点位于同一直线上:斜率相同的点 + 相同位置的点方法二: 循环遍历每个点,先统计其他点与当前点的重合个数dup 以及与当前点在同一条垂直线上vlt的个数(斜率不存在的情况), 再统计其他点与当前点在同一条直线的个数(斜率存在的情况),可利用HashMap统计这个点相对于其他点的不同斜率的个原创 2020-09-25 18:14:47 · 968 阅读 · 0 评论 -
计算逆波兰式(后缀表达式)的值
题目描述计算逆波兰式(后缀表达式)的值运算符仅包含"+","-","*“和”/",被操作数可能是整数或其他表达式示例解题思路逆波兰表达式的解释器一般是基于堆栈的。解释过程一般是:操作数入栈;遇到操作符时,操作数出栈,求值,将结果入栈;当一遍后,栈顶就是表达式的值。代码import java.util.*;public class Solution { /** * * @param tokens string字符串一维数组 * @return原创 2020-09-25 15:47:49 · 358 阅读 · 1 评论 -
求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。
题目描述:求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。解题思路:1.检测当前的根节点是否为空,为空则压根没有最小深度return null,如果不为空,我们新建一个arraylist储存所有叶节点的depth,同时我们从根节点开始dfs(call DFS function).2.DFS function 内,我们首先需要检测当前收到的节点是不是叶节点,如果是,我们就把他的深度放进arraylist里。如果不是叶节点,我们继续用dfs循环往下找他的左孩子和右原创 2020-09-25 15:05:37 · 347 阅读 · 0 评论 -
已知树的前序,中序遍历,重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题://递归实现//根据前序序列第一个结点确定根结点//根据根结点在中序序列中的位置分割出左右两个子序列//对左子树和右子树分别递归使用同样的方法继续分解import java.util.Arrays;public class Soluti原创 2020-08-09 12:16:17 · 143 阅读 · 0 评论 -
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
题目描述:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。解题:方法一://反转列表实现 public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { List<Integer> list = new ArrayList<Integer>(); if (listNode == null) { return (原创 2020-08-09 11:07:00 · 148 阅读 · 0 评论