剑指offer
吴二喵
拒绝拖延,拒绝熬夜,提高效率!
展开
-
翻转单词顺序
题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点 符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出”student. a am I”。并尽可能减少空间消耗。Java代码实现public class ReverseSentence { public static void main(String[] args){原创 2016-09-10 23:18:47 · 310 阅读 · 0 评论 -
Q8--二进制中1的个数
题目请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2.java代码实现public class Main { public static void main(String[] args){ int n = 15; System.out.println(numberOf1A(n)原创 2016-09-04 11:21:24 · 247 阅读 · 0 评论 -
Q9--数值的整数次方
一、题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。二、解题思路几个注意点: 1、由于计算机表示小数(包括float和double型小数)都有误差,我们不能直接用等号(==)判断两个小数是否相等。如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等。 2、要考虑指原创 2016-10-23 22:41:47 · 422 阅读 · 0 评论 -
Q10--链表中倒数第k个结点
题目输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。java代码实现/*class ListNode{ int val; ListNode next; ListNode(int x){ val =原创 2016-09-05 10:28:50 · 306 阅读 · 0 评论 -
Q11--反转链表
一、题目描述输入一个链表,反转链表后,输出链表的所有元素。二、解题思路用三个指针来操作。三、Java代码实现public class Solution { public ListNode ReverseList(ListNode head) { if(head == null) return null; ListNode p1 = head;原创 2016-10-24 14:29:32 · 423 阅读 · 0 评论 -
Q12--合并两个排序的链表
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。解题思路1、要有边界判断,判断链表为空的情况 2、采用递归的思路/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/pu原创 2016-09-30 16:24:18 · 184 阅读 · 0 评论 -
Q13--树的子结构
题目输入两棵二叉树A,B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)解题思路第一步在树A中找到和B的根节点的值一样的结点R 第二步再判断树A种以R为根结点的子树是不是包含和树B一样的结构。java代码实现/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right原创 2016-09-05 12:35:32 · 190 阅读 · 0 评论 -
Q13--二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 解题思路先前序遍历树的每个节点,如果遍历到的结点有子结点,就交换它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。java代码实现/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;原创 2016-09-06 13:24:42 · 187 阅读 · 0 评论 -
Q14--顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。例如:如果输入矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印数字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10代码实现import java.util.ArrayList; public class PrintMatrixClockWis原创 2016-09-30 23:26:51 · 227 阅读 · 0 评论 -
包含min函数的栈
一、题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。二、解题思路用一个辅助栈存储当前栈中的最小元素值。三、Java代码实现import java.util.Stack;public class Solution { Stack<Integer> stack = new Stack<Integer>(); Stack<Integer> minStack =原创 2016-10-24 18:47:29 · 327 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。解题思路如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入站的数字压入辅助栈原创 2016-10-02 22:03:18 · 376 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同一层的结点按照从左到右的顺序打印。 解题思路用一个队列来做 代码实现import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/**public class TreeNode { int val = 0; TreeNode left =原创 2016-10-02 23:34:14 · 226 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
一、题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二、解题思路采用递归的思路。二叉搜索树满足左子树的元素小于根节点元素的值,右子树的元素大于根节点元素的值三、Java代码实现public class Solution { public boolean VerifySquenceOfBST(in原创 2016-10-24 23:44:31 · 292 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。Java代码实现package jianzhioffer;import java.util.ArrayList;class TreeNode{ int val; TreeNode left; TreeNode right;原创 2016-09-07 11:40:23 · 195 阅读 · 0 评论 -
Q7--斐波那契数列
一、题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。二、解题思路可以用递归的解法,也可以用非递归的解法三、Java代码实现//递归实现public int Fibonacci(int n) { if(n==0) return 0; if(n==1) return 1; return Fibonacci(n-1)+Fibonacci原创 2016-10-23 20:20:59 · 423 阅读 · 0 评论 -
Q6--旋转数组的最小数字
一、题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。二、解题思路最简单的方法是遍历数组得到最小的元素,算法复杂度是O(N)。但是没有利用旋转数组的特性,利用它的特性,我们原创 2016-10-23 19:51:12 · 320 阅读 · 0 评论 -
Q5--用两个栈实现队列
一、题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。二、解题思路添加元素直接添加到栈1中,弹出元素的时候要判断栈2,如果栈2不为空可以直接弹出,如果栈2为空,将栈1中的元素全部压入到栈2当中,然后再弹出。三、Java代码实现import java.util.Stack;public class Solution { Stack<Integer> s原创 2016-10-22 23:03:13 · 451 阅读 · 0 评论 -
二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度解题思路这道题用递归实现比较简单。如果一棵树只有一个结点,它的深度为1,。如果有右子树和左子树,那该树的深度是其左、右子树深度的较大值加1.java代码实现/*public class TreeNode { int val = 0; TreeNode lef原创 2016-09-05 15:27:10 · 190 阅读 · 0 评论 -
平衡二叉树
题目描述输入一棵树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。解题思路可以结合二叉树的深度的题目来看,简单的做法可以用递归实现,但是时间复杂度会比较高,因为会重复计算。java代码实现class TreeNode{ int val = 0; TreeNode left = null; TreeNode ri原创 2016-09-05 15:37:50 · 205 阅读 · 0 评论 -
扑克牌顺子
题目描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。解题思路Java代码实现import java.util.Arrays;public class Solution { public boolean isContinuous(int [] numbers) { i原创 2016-09-06 15:21:56 · 276 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。Java代码实现/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.va原创 2016-09-06 15:58:17 · 237 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。Java代码实现import java.util.Random;//如果一个数字出现的次数超过数组长度的一半,那么按照顺序排列,位于中位数上的元素一定是该数字。所以//这题就可以转换原创 2016-09-07 15:11:31 · 404 阅读 · 0 评论 -
字符流中第一个不重复的字符
第一种解法:import java.util.Scanner;import java.util.HashMap;/* * 用HashMap记录字符出现的次数,然后重新遍历一次,算法比较简单,但是空间复杂度和时间复杂度很高 */public class CharStatistics2 { public static void main(String[] args){原创 2016-09-20 14:43:00 · 449 阅读 · 0 评论 -
连续子数组的最大和
题目描述输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。Java代码实现public class FindGreatestSumOfSubArray { public static void main(String[] args){ int[] array = {1,-2,3,10,-4,7,2,-5};原创 2016-09-08 15:41:47 · 256 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。Java代码实现import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class Pr原创 2016-09-08 21:12:45 · 246 阅读 · 0 评论 -
字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 思路分析这题可以用递归的算法来做。 把字符串分为两个部分,一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符。,可以把第一个字符和它后面的字符逐个交换,是第一个字符的所有情况。第一原创 2016-09-08 21:57:29 · 214 阅读 · 0 评论 -
Q1--二维数组中的查找
一、题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。二、解题思路将要查找的元素和二维数组(矩阵)的右上角元素比较,如果相等则返回true。如果大于这个元素,那么可以把第一行的元素去掉;如果小于这个元素,那么可以把最后一列的元素去掉,这样每次比较都可以去掉一行或者一列。当然也可原创 2016-10-22 21:09:17 · 265 阅读 · 0 评论 -
Q2--替换空格
一、题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。二、解题思路可以采取从后往前操作的方式,先遍历原来的字符串判断有多少个空格,如果空格的个数为count,那么替换后的字符串长度为原来的字符串长度+2*count。算法复杂度为O(n)。如果从前往后操作,每次替换都要将后面所有的字符往后移原创 2016-10-22 21:43:21 · 272 阅读 · 0 评论 -
Q3--从尾到头打印链表
题目描述输入一个链表的头结点,从尾到头反过来打印出每个结点的值。代码实现import java.util.ArrayList;import java.util.Stack;class ListNode{ int val; ListNode next = null; ListNode(int val){ this.val = val; }}publ原创 2016-09-04 23:10:59 · 200 阅读 · 0 评论 -
Q4--重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},可以重建出它的二叉树并输出它的头结点。代码import java.util.LinkedList;import java.util.Queue;class TreeNode{原创 2016-09-03 20:50:49 · 198 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述一个整形数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解题思路1、如果只有一个数字出现一次,别的出现两次,那么将所有的数异或的结果就是只出现一次的数。 2、如果有两个数字出现一次,我们的想法就是把它分成两组,每一组只包含一个只出现一次的数。所有数异或的结果肯定不为0,二进制表示中至少包含一个1,那么可以找原创 2016-09-30 20:45:30 · 200 阅读 · 0 评论