剑指Offer(Java版解析)
振哥在,世界充满爱!
计划+坚持!+思考
展开
-
Q281:字符串的组合形式
publicclass Q281 { /** * 题目:字符串的组合 * 题目说明:输入字符串,打印该字符串的所有组合形式。例如,输入abc,它的组合有a,b,c,ab,ac,bc,abc * 解题思路:本例是利用非递归的形式,将组合打印出来的。利用位数的二进制形式来判断是否存在组合的形式 */ publicstatic原创 2016-08-06 16:21:51 · 399 阅读 · 0 评论 -
Q33:把数组排成最小的数
publicclass Q33把数组排成最小的数 { /** * 题目:把数组排成最小的数 * 题目说明:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数字{3,32,321},则打印出这3个数字能排成的最小数字321323 * 解题思路:先比较两个数的组合情况,以及大小的比较情况。例如输入原创 2016-08-11 22:28:02 · 382 阅读 · 0 评论 -
Q34:丑数
publicclass Q34丑数 { /** * 题目:丑数 * 题目说明:我们把只包含因子2,3,5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如,6,8都是丑数,14不是丑数,因为它包含因子7,。习惯上我们把1当做第一个丑数。 * 解题思路(1):判断每个整数是不是丑数的解法,不管该数是不是丑数都要进行原创 2016-08-12 17:28:47 · 2231 阅读 · 0 评论 -
Q35:第一个只出现一次的数字
importjava.util.LinkedHashMap;publicclass Q35第一个只出现一次的数字 { /** * 题目:第一个只出现一次的字符 * 题目说明:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。 * 解题思路:定义一个哈希表的键(key)是字符,值(value)是出现的次数。第一原创 2016-08-12 22:00:09 · 541 阅读 · 0 评论 -
Q351:从字符串1中删除字符串2中出现的字符
importjava.util.LinkedHashMap;publicclass Q351从字符串1中删除字符串2中出现的字符 { /** * 题目:从字符串1中删除字符串2中出现的字符 * 题目说明:定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符。例如字符串1为“We are student.”中删除字符串2“ae原创 2016-08-12 22:02:28 · 1977 阅读 · 0 评论 -
Q36:数组中的逆序对
publicclass Q36数组中的逆序对 { /** * 题目:数组中的逆序对 * 题目说明:在数组中的两个数字如果前一个数字大于后一个数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组的逆序对的总数。 * 例如在数组{7,5,6,4} 中,一共存在 5 个逆序对,分别是(7,6)、(7、5),(7、4),(6、4),(5、4原创 2016-08-13 10:21:39 · 389 阅读 · 0 评论 -
Q37:两个链表的第一个公共结点
publicclass Q37两个链表的第一个公共结点 { /** * 题目:两个链表的第一个公共结点 * 题目说明:输入两个链表(从数据结构得出是单链表),找出它们的第一个公共结点。(公共结点说明数据域部分和指针域部分相同,因此在公共结点后的所有元素都重合,类似于字母“Y”的样式) * 解题思路(1):使用蛮力搜索法,遍历链表1的每个元素,每原创 2016-08-14 11:41:55 · 309 阅读 · 0 评论 -
Q38:数字在排序数组中出现的次数
public class Q38数字在排序数组中出现的次数 { /** * 题目:数字在排序数组中出现的次数 * 题目说明:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. * 解题思路:由于是排序好的数组,因此利用二分查找算法来实现,首先找出第一个出现3的位置,其次找出最后一个出现3的位置,这样就容易求该数原创 2016-08-14 21:03:00 · 279 阅读 · 0 评论 -
Q40:数组中只出现一次的数字
publicclass Q40数组中只出现一次的数字 { /** * 题目:数组中只出现一次的数字 * 题目说明:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 * 解题思路:***该题比较难,也比较经典,作为自己提升的典型题目*** * 1原创 2016-08-14 23:03:29 · 357 阅读 · 0 评论 -
Q41:和为s的两个数字VS和为s的连续正数序列
publicclass Q41和为s的两个数字VS和为s的连续正数序列 { /** * 题目:和为s的两个数字VS和为s的连续正数序列 * 题目说明:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 * 解题思路:从数组的两端遍历数组,下标为start和end,如果arr原创 2016-08-15 09:49:19 · 367 阅读 · 0 评论 -
Q411:打印所有和为s的连续正数序列
publicclass Q411打印所有和为s的连续正数序列 { /** * 题目:打印所有和为s的连续正数序列 * 题目说明:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出3个连续的序列1,2,3,4,5 4,5,6 7,8 * 解题思路:原创 2016-08-15 10:42:52 · 962 阅读 · 1 评论 -
Q42:翻转单词顺序VS左旋转字符串
publicclass Q42翻转单词顺序VS左旋转字符串 { /** * 题目:翻转单词顺序VS左旋转字符串 * 题目说明:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符合和普通字符一样处理。例如输入字符串“I am a student.",则输出"student. a am I"。 * 解题思路(1):翻原创 2016-08-16 15:39:02 · 345 阅读 · 0 评论 -
Q421:把字符串前面的若干个字符转移到字符串的尾部
publicclass Q421把字符串前面的若干个字符转移到字符串的尾部 { /** * 题目:把字符串前面的若干个字符转移到字符串的尾部 * 题目说明:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到的结果“cdefgab”。原创 2016-08-16 17:13:21 · 1014 阅读 · 0 评论 -
Q43:n个骰子的点数
importjava.lang.Math;publicclass Q43n个骰子的点数 { /** * 题目:n个骰子的点数 * 题目说明:把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。 * 解题思路(1):现在我们考虑如何统计每一个点数出现的次数。要想求出n个骰子的点数和,可以先把n个原创 2016-08-17 19:45:45 · 606 阅读 · 0 评论 -
Q44:扑克牌的顺子
importjava.util.Arrays;publicclass Q44扑克牌的顺子 { /** * 题目:扑克牌的顺子 * 题目说明:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。 * 解题思路:由于大小王可以看成任意数字,因此原创 2016-08-17 21:28:38 · 592 阅读 · 0 评论 -
Q45:圆圈中最后剩下的数字
备注:感觉这道题目的代码虽少,但理解起来还是有一定的难度,大家最好用纸和笔算算,仔细找一下映射前后函数的变化,是如何推导出递归式的。publicclass Q45圆圈中最后剩下的数字 { /** * 题目:圆圈中最后剩下的数字 * 题目说明:0,1, ... ,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的原创 2016-08-18 21:22:24 · 406 阅读 · 0 评论 -
Q32:从1到n整数中1出现的次数
publicclass Q32 { /** * 题目:从1到n整数中1出现的次数 * 题目说明:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,1一共出现5次。 * 解题思路(1):利用基本的方法来做,但效率不高。遍历每个数字,然后统计每个数字中1的个数。原创 2016-08-11 09:49:01 · 744 阅读 · 0 评论 -
Q31:连续子数组的最大和
publicclass Q31 { /** * 题目:连续子数组的最大和 * 题目说明:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n)。 * 举例说明:输入数组{1,-2,3,10,-4,7,2,-5}和的子数组最大的为{3,10,-4,7,2},因此输出18原创 2016-08-11 09:46:40 · 699 阅读 · 0 评论 -
Q30:最小的k个数
importjava.util.Arrays;publicclass Q30 { /** * 题目:最小的k个数 * 题目说明:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这个八个数字,则最小的4个数字是1,2,3,4 * 解题思路:将原数组array中的k个数字复制到新的数组karray中。然后利用karra原创 2016-08-10 08:50:18 · 905 阅读 · 0 评论 -
Q28:字符串的排序
publicclass Q28 { /** * 题目:字符串的排列 * 题目说明:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符串a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba. * 解题思路:1)首先求出在第一个位置上可能出现的字符,即把第一个字符和后面所有的字符逐一交换原创 2016-08-06 16:14:56 · 271 阅读 · 0 评论 -
Q55:字符流中第一个不重复的字符
import java.util.ArrayList;import java.util.HashMap;public class Q55字符流中第一个不重复的字符 { /** * @param args * 题目:字符流中第一个不重复的字符 * 题目说明:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符“go”时, * 第一个只出现一次原创 2016-08-27 09:34:28 · 612 阅读 · 0 评论 -
Q54:表示数值的字符串
public class Q54表示数值的字符串 { /** * 题目:表示数值的字符串 * 题目说明:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如字符串“100”、“5e2”、“-123”、“3.1216”及“1E-16”都表示数值, * 但“12e”、“1a3.14”等不是。 * 解题思路:首先要明确字符串的格式: *[sign原创 2016-08-26 22:47:31 · 1014 阅读 · 0 评论 -
Q53:正则表达式匹配
public class Q53正则表达式匹配 { /** * 题目:正则表达式匹配 * 题目说明:请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,'*'表示它签名的字符可以出现任意次(包含0次)。 * 本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa原创 2016-08-23 22:51:22 · 300 阅读 · 0 评论 -
Q27:二叉搜索树与双向链表
importBinaryTree.BinaryTreeNode;publicclass Q27 { /** * 题目:二叉搜索树与双向链表 * 题目说明:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 * 解题思路:1)首先理解二叉搜索树的特点是:左子树的结点值小于根节点值原创 2016-08-05 13:44:10 · 247 阅读 · 0 评论 -
Q67:机器人的运动范围
public class Q67机器人的运动范围 { /** * 题目:机器人的运动范围 * 题目说明:地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每一次可以向左,右,上,下移动一格,但不能进入行坐标和列坐标的数位之和大于K的格子。例如,当K为18时,机器人能够进入方格(35,37)因为,3+5+3+7=18,但是不能进入方格(35,38),因为3+5+3+8=原创 2016-08-31 20:19:14 · 533 阅读 · 0 评论 -
Q66:矩阵中的路径
import java.lang.reflect.Array;public class Q66矩阵中的路径 { /** * 题目:矩阵中的路径 * 题目说明:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以再矩阵中向左右上下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。 * 解题思路:用回原创 2016-08-31 17:32:01 · 439 阅读 · 0 评论 -
Q29:数组中出现次数超过一半的数字
publicclass Q29 { /** * 题目:数组中出现次数超过一半的数字 * 题目说明:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于2在数组中出现了5次,超过数组长度的一半,因此输出2. * 解题思路:解决该问题可以从三种方法考虑。 *原创 2016-08-09 22:40:03 · 293 阅读 · 0 评论 -
Q52:构建乘积数组
public class Q52构建乘积数组 { /** * 题目:Q52构建乘积数组 * 题目说明:给定一个数组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]不能使用除法 * 解题思路:由于B[i]的元素是数组A中除去A[i]原创 2016-08-21 20:50:16 · 430 阅读 · 0 评论 -
Q51:数组中重复的数字
public class Q51数组中重复的数字 { /** * 题目:数组中重复的数字 * 题目说明:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 * 请找出数组中任意一个重复的数字。例如输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或3.原创 2016-08-21 20:47:28 · 348 阅读 · 0 评论 -
Q65:滑动窗口的最大值
import java.util.ArrayList;import java.util.Deque;import java.util.LinkedList;public class Q65滑动窗口的最大值 { /** * 题目:滑动窗口的最大值 * 题目说明:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如输入数组 {2,3,4,2,6,2,5,1}以及滑动窗口的原创 2016-08-31 11:20:43 · 594 阅读 · 0 评论 -
Q64:数据流中的中位数
import java.util.ArrayList;import java.util.Comparator;import org.omg.CORBA.PUBLIC_MEMBER;public class Q64数据流中的中位数 { /** * 题目:数据流中的中位数 * 题目说明:如何得到一个数据流的中位数?如果从数据流中读取奇数个数值,那么中位数就是所有数值排序之后位于中间的数原创 2016-08-30 20:17:18 · 699 阅读 · 0 评论 -
Q48:不能被继承的类 ——学习笔记
public class Q48不能被继承的类 { //把构造函数设为私有函数 public static Q48不能被继承的类 getInstance() { return new Q48不能被继承的类(); } public static void deleteInstance(Q48不能被继承的类 instance) {原创 2016-08-19 22:21:25 · 333 阅读 · 0 评论 -
Q47:不用加减乘除做加法
public class Q47不用加减乘除做加法 { /** * 题目:不用加减乘除做加法 * 题目说明:写一个函数求两数之和,要求在函数体内不能使用+、-、*、/四则运算符号。 * 解题思路:考虑二进制数字的异或运算。 */ public static void main(String[] args) { Q47不用加减乘除做加法 tes原创 2016-08-19 21:55:04 · 793 阅读 · 0 评论 -
Q63:二叉搜索树的第K个结点
import BinaryTree.BinaryTreeNode;public class Q63二叉搜索树的第K个结点 { /** * 题目:二叉搜索树的第K个结点 * 题目说明:给定一棵二叉搜索树,请找出其中的第K个大的结点。 * 解题思路:由于是二叉搜索树,因此中序遍历二叉树时,产生的序列是按照递增顺序排好序的,因此只需要找到第K个结点并访问就可以了。 */ publi原创 2016-08-29 17:41:30 · 526 阅读 · 0 评论 -
Q46:求1到n的和
import java.lang.reflect.InvocationTargetException;public class Q46求1到n的和 { /** * 题目:求1+2+ ... +n * 题目说明:求1+2+ ... +n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A ? B : C)。 * 解题思路:利用反射找到原创 2016-08-18 22:20:18 · 1443 阅读 · 0 评论 -
Q62:序列化二叉树
import java.awt.List;import BinaryTree.BinaryTreeNode;public class Q62序列化二叉树 { /** * 题目:序列化二叉树 * 题目说明:请实现两个函数,分别用来序列化和反序列化二叉树。 * 解题思路:区分一下序列化和反序列化:把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化原创 2016-08-29 15:44:02 · 460 阅读 · 0 评论 -
Q61:按之字形顺序打印二叉树
import java.util.ArrayList;import java.util.Stack;import BinaryTree.BinaryTreeNode;public class Q61按之字形顺序打印二叉树 { /** * 题目:按之字形顺序打印二叉树 * 题目说明:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,原创 2016-08-29 10:52:48 · 647 阅读 · 0 评论 -
Q391判断是否为平衡二叉树(递归实现)
import BinaryTree.BinaryTreeNode;//二叉树的深度——平衡二叉树public class Q391 {/*** 题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树* 思路:要判断二叉树,需要知道每个结点的深度(通过Q39来得到)*/public static void main(String[] args) {Binary原创 2016-06-17 20:48:27 · 358 阅读 · 0 评论 -
Q392判断是否为平衡二叉树(后序遍历实现)
import BinaryTree.BinaryTreeNode;//判断二叉树是否为平衡二叉树public class Q392 {/*** 题目:输入一棵二叉树,判断该树是不是平衡二叉树,在Q391中给出的解法是通过递归遍历实现的。* 该方法操作简单,但是有的结点需要访问多长,导致时间效率比较低。* 在Q392是通过后序遍历实现的*/public static原创 2016-06-17 21:09:00 · 438 阅读 · 1 评论 -
Q39:二叉树的深度(递归实现)
import javax.swing.RootPaneContainer;import BinaryTree.BinaryTreeNode;//二叉树的深度public class Q39 {/** 题目:输入一棵二叉树的根节点,求该树的深度* 思路:采用递归算法:树的高度=1(根节点)+max{左子树的深度,右子树的深度};*/public static void原创 2016-06-17 20:30:35 · 271 阅读 · 0 评论