剑指Offer
GeeksforGeeks
没有什么比技术更好的认证
展开
-
68_getLowestCommonParentBST
package pers.lyt.java;//题目// 输入两个树结点,求它们的最低公共祖先。//思路// 该题首先要和面试官确定是否为二叉树,得到肯定答复后,还要确定是否为二叉搜索树,是否//有父指针,或者仅仅是普通二叉树。// 1.树为二叉搜索树时,最低公共祖先结点的大小在两个树结点大小的中间。// 2.树为普通树时,使用遍历将子结点的信息往上传递。在左右子树中进行查找是否存...原创 2019-12-14 11:16:21 · 86 阅读 · 0 评论 -
67_StringToInt
package pers.lyt.java;//题目// 请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他//类似的库函数。//思路// 题目很简单,主要就是实现对每个字符转化为数字,并进行累加即可。但是有很多特殊情况都//需要考虑进去,例如null、空字符串、带有正负号、字符不是数字、溢出等等。// 对于非法的特殊输入,返回值为0,还...原创 2019-12-14 11:15:40 · 103 阅读 · 0 评论 -
66_ConstuctArray
package pers.lyt.java;//题目// 给定一个数组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]。不能使用除法。//思路// 无法使用除法,正常连乘的话时间复杂度为O(n^2),效率非常低。// 考虑到计算每个B[i]时都会有重复,思考...原创 2019-12-14 11:15:04 · 163 阅读 · 0 评论 -
65_AddTwoNumbers
package pers.lyt.java;//题目// 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。//思路// 对数字做运算,除了四则运算外,只剩下位运算了。根据一般情况下的加法步骤,设计如下:// 1)不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或^操作;// 2)计算进位:只有1加1产生进位,所以采用位与...原创 2019-12-14 11:14:37 · 102 阅读 · 0 评论 -
64_Accumulate
package pers.lyt.java;//题目// 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件//判断语句(A?B:C)。//思路// 不能使用乘除法,不能使用循环语句、判断语句。可以考虑的有 单目运算符:++和--,//双目运算符:+,-,移位运算符<<和>>,关系运算符>,...原创 2019-12-14 11:14:06 · 136 阅读 · 0 评论 -
63_MaximalProfit
package pers.lyt.java;//题目// 假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股票可能获得的利润是多少?//例如一只股票在某些时间节点的价格为{9, 11, 8, 5,7, 12, 16, 14}。如果我们能在价格为5的//时候买入并在价格为16时卖出,则能收获最大的利润11。//思路// 股票交易的利润来自股票买入和卖出价格的差价。只能在买...原创 2019-12-10 22:42:43 · 78 阅读 · 0 评论 -
62_LastNumberInCircle
package pers.lyt.java;import java.util.LinkedList;//题目// 0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。//求出这个圆圈里剩下的最后一个数字。//思路// 方法一:采用链表来存放数据,每次对长度取余来实现循环// 将所有数字放入LinkedList链表中(LinkedList比A...原创 2019-12-10 22:42:02 · 78 阅读 · 0 评论 -
61_ContinousCards
package pers.lyt.java;import java.util.Arrays;//题目// 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,//A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。//思路// 输入为大小等于5的数组(大小王记为0),输出为布尔值。具体步骤如下://1)进行对5张牌进行排序;//...原创 2019-12-10 22:41:19 · 75 阅读 · 0 评论 -
60_DicesProbability
package pers.lyt.java;import java.text.NumberFormat;//题目// 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率//思路// 对于n个骰子,要计算出每种点数和的概率,我们知道投掷n个骰子的总情况一共有6^n种,//因此只需要计算出某点数和的情况一共有几种,即可求出该点数之和的概率。/...原创 2019-12-10 22:40:42 · 162 阅读 · 0 评论 -
59_QueueWithMax
package pers.lyt.java;import java.util.ArrayDeque;import java.util.Deque;//题目// 请定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back和pop_front的//时间复杂度都是O(1)。//思路// 与滑动窗口的最大值一题相似,利用双端队列来存储当前队列里的最大值以及之后可...原创 2019-12-10 22:39:46 · 141 阅读 · 0 评论 -
58_ReverseWordsInSentence
package pers.lyt.java;//题目// 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号//和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。//思路// 首先实现翻转整个句子:只需要在首尾两端各放置一个指针,交换指针所指的数字,两端指针//往中间移动即可。之后根据空格...原创 2019-12-09 16:57:24 · 97 阅读 · 0 评论 -
58_LeftRotateString
package pers.lyt.java;//题目// 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现//字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的//结果"cdefgab"。//思路// 本题思路和上一道题翻转单词顺序的原理一模一样,只是上一道题有空格,这道题没空格,//先分别翻转前半部分字...原创 2019-12-09 16:56:35 · 102 阅读 · 0 评论 -
57_TwoNumbersWithSum
package pers.lyt.java;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;//题目// 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有//多对数字的和等于s,输出任意一对即可。//思路// 从头开始遍历数字,确定一个数字后,对...原创 2019-12-09 16:56:04 · 91 阅读 · 0 评论 -
57_ContinuousSquenceWithSum
package pers.lyt.java;import java.util.ArrayList;import java.util.List;//题目// 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,//由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。//思路:指针法// 类似(57-1) 和...原创 2019-12-09 16:55:34 · 77 阅读 · 0 评论 -
56_NumbersAppearOnce
package pers.lyt.java;//题目// 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次//的数字。要求时间复杂度是O(n),空间复杂度是O(1)。//思路// 两个相同的数字异或等于0.// 如果数组中只有一个数字只出现一次,其他的数字出现两次,我们从头到尾异或每个数字,那么//最终的结果刚好是那个只出现一次的数字。而本题里数...原创 2019-12-09 16:55:02 · 104 阅读 · 0 评论 -
56_NumberAppearingOnce
package pers.lyt.java;//题目// 在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的//数字。//思路// 这道题中数字出现了三次,无法像数组中只出现一次的两个数字一样通过利用异或位运算进行//消除相同个数字。但是仍然可以沿用位运算的思路。// 将所有数字的二进制表示的对应位都加起来,如果某一位能被三整除,那么只出现一次的数...原创 2019-12-09 16:54:26 · 81 阅读 · 0 评论 -
55_TreeDepth
package pers.lyt.java;//题目// 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的/结点(含根、叶结点)//形成树的一条路径,最长路径的长度为树的深度。//思路// 简洁理解:树的深度 = max(左子树深度,右子树深度) + 1。采用递归实现。public class Offer55_TreeDepth { public class Tre...原创 2019-12-09 16:53:59 · 149 阅读 · 0 评论 -
55_BalancedBinaryTree
package pers.lyt.java;//题目// 输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树//的深度相差不超过1,那么它就是一棵平衡二叉树。//思路// 计算树的深度,树的深度=max(左子树深度,右子树深度)+1。//在遍历过程中,判断左右子树深度相差是否超过1,如果不平衡,则令flag为false,用来表示树//不平衡。pub...原创 2019-12-09 16:53:26 · 67 阅读 · 0 评论 -
54_KthNodeInBST
package pers.lyt.java;import java.util.Stack;//题目// 给定一棵二叉搜索树,请找出其中的第k小的结点。//思路// 设置全局变量index=0,对BST进行中序遍历,每遍历一个结点,index+1,当index=k时,//该结点即为所求结点。public class Offer54_KthNodeInBST { public cl...原创 2019-12-09 16:52:52 · 68 阅读 · 0 评论 -
53_MissingNumber
package pers.lyt.java;//题目// 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。//在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。//思路// 如果从头到尾依次比较值与小标是否相等,时间复杂度为O(n),效率低。//由于是排序数组,我们继续考虑使用二分查找算法,找出数组中第一个值和下标不相...原创 2019-12-08 15:58:43 · 100 阅读 · 0 评论 -
53_IntegerIdenticalToIndex
package pers.lyt.java;//题目// 假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中//任意一个数值等于其下标的元素。例如,在数组{-3, -1,1, 3, 5}中,数字3和它的下标相等。//思路// 同53-1和53-2一样,不再从头到尾遍历,由于是排序数组,我们继续考虑使用二分查找算法://1)当中间数字等于其下标时,中间...原创 2019-12-08 15:58:16 · 104 阅读 · 0 评论 -
52_FirstCommonNodesInLists
package pers.lyt.java;//题目// 输入两个链表,找出它们的第一个公共结点。//思路// 蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等。//时间复杂度为O(m*n),效率低;// 使用栈:由于公共结点出现在尾部,所以用两个栈分别放入两个链表中的结点,从尾结点开始出栈//比较。时间复杂度O(m+n),空间复杂度O(m+n...原创 2019-12-08 15:57:46 · 76 阅读 · 0 评论 -
51_InversePairs
package pers.lyt.java;//题目 // 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。//输入一个数组,求出这个数组中的逆序对的总数。//思路// 如果遍历数组,对每个数字都和后面的数字比较大小,时间复杂度为O(n^2),效率太低。//利用归并排序的思想,先将数组分解成为n个长度为1的子数组,然后进行两两合并同时排好顺序。//在对...原创 2019-12-08 15:57:12 · 85 阅读 · 0 评论 -
50_FirstNotRepeatingChar
package pers.lyt.java;//题目 // 在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。//思路// 创建哈希表,键值key为字符,值value为出现次数。第一遍扫描:对每个扫描到的字符的次数加一;//第二遍扫描:对每个扫描到的字符通过哈希表查询次数,第一个次数为1的字符即为符合要求的输出。//由于字符(char)是长度为8的数据...原创 2019-12-08 15:56:43 · 219 阅读 · 0 评论 -
50_FirstCharacterInStream
package pers.lyt.java;//题目 // 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前//两个字符"go"时,第一个只出现一次的字符是'g'。当从该字符流中读出前六个字符"google"时,//第一个只出现一次的字符是'l'。//思路// 字符只能一个一个从字符流中读出来,因此要定义一个容器来保存字符以及其在字符流中的位置。//...原创 2019-12-08 15:56:07 · 83 阅读 · 0 评论 -
49_UglyNumber
package pers.lyt.java;//题目:丑数// 把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。//例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。// 习惯上我们把1当做是第一个丑数。1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24。...原创 2019-12-08 15:55:37 · 92 阅读 · 0 评论 -
48_LongestSubstringWithoutDup
package pers.lyt.java;//题目// 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。//假设字符串中只包含从'a'到'z'的字符。//思路//动态规划法:定义函数f(i)为:以第i个字符为结尾的不含重复字符的子字符串的最大长度。//(1)当第i个字符之前未出现过,则有:f(i)=f(i-1)+1//(2)当第i个字符之前出现过,记...原创 2019-12-08 15:55:06 · 70 阅读 · 0 评论 -
47_MaxValueOfGifts
package pers.lyt.java;//题目 // 在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。//你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者向下移动一格直到到达棋盘的//右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?//思路// 动态规划:定义f(i,j)为到达(i,j)位置格子时能拿到的礼物总和的最大...原创 2019-12-08 15:54:31 · 86 阅读 · 0 评论 -
46_TranslateNumbersToStrings
package pers.lyt.java;//题目 // 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",……,//11翻译成"l",……,25翻译成"z"。一个数字可能有多个翻译。例如12258有5种不同的翻译,//它们分别"bccfi", "bwfi", "bczi", "mcfi" 和"mzi" 。请编程实现一个函数用来计算一个//数字有多少种不...原创 2019-12-08 15:54:00 · 81 阅读 · 0 评论 -
45_SortArrayForMinNumber
package pers.lyt.java;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;//题目 // 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中//最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排...原创 2019-12-03 22:19:01 · 76 阅读 · 0 评论 -
44_DigitsInSequenc
package pers.lyt.java;//题目 // 数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位//(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。//思路// 逐一枚举数字,计算每个数字的位数相加,效率太低。// 观察规律://个位数的个数一共有10个,即0~9,共占了10*...原创 2019-12-03 22:18:16 · 111 阅读 · 0 评论 -
43_NumberOf1
package pers.lyt.java;//题目 // 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些//整数中包含1 的数字有1,10,11和12,1一共出现了5次。//思路// 如果是从头到尾遍历(n次),对每一个数字都计算其1的个数(lgn次),则时间复杂度为O(nlogn)//,运算效率太低。因此必须总结规律,提高效率。//...原创 2019-12-03 17:58:55 · 192 阅读 · 0 评论 -
42_GreatestSumOfSubarrays
package pers.lyt.java;//题目 // 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整/数组成一个子数组。//求所有子数组的和的最大值。要求时间复杂度为O(n)。//思路// 分析规律,从第一个数字开始累加,若走到某一个数字时,前面的累加和为负数,说明不能//继续累加了,要从当前数字重新开始累加。在累加过程中,将每次累加和的最大值记录下来,//...原创 2019-12-03 17:58:21 · 114 阅读 · 0 评论 -
41_StreamMedian
package pers.lyt.java;import java.util.Comparator;import java.util.PriorityQueue;//题目 // 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值//排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后//中间两个数的平均值。//思路...原创 2019-12-03 17:57:52 · 198 阅读 · 0 评论 -
40_KLeastNumbers
package pers.lyt.java;import java.util.ArrayList;//题目 // 输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,//则最小的4个数字是1、2、3、4。//思路// 思路一:同剑指offer(39) 数组中出现次数超过一半的数字中使用partition()方法,//基于数组的第k个数字调整,使得...原创 2019-12-01 21:20:02 · 101 阅读 · 0 评论 -
39_MoreThanHalfNumbers
package pers.lyt.java;//题目 // 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的//数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,//因此输出2。//思路:数字次数超过一半,则说明:该数字出现的次数比其他数字之和还多// 遍历数组过程中保存两个值:一个是数...原创 2019-12-01 21:19:29 · 91 阅读 · 0 评论 -
38_StringPermutation
package pers.lyt.java;import java.util.ArrayList;import java.util.Collections;//题目 // 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由//字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。(本文代码采用//ArrayList<...原创 2019-12-01 21:18:40 · 121 阅读 · 0 评论 -
37_序列化二叉树
package pers.lyt.java;//题目 // 请实现两个函数,分别用来序列化和反序列化二叉树。//思路// 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,但是其实可以只采用//前序遍历(从根结点开始),将空结点(null)输出为一个特殊符号(如“$”),就可以确定一个//二叉树了。// 将二叉树序列化为字符串,就是前序遍历的过程,遇见空结点时,序列化为...原创 2019-11-24 23:36:31 · 63 阅读 · 0 评论 -
36_二叉搜索树与双向链表
package pers.lyt.java;import java.util.Stack;//题目 // 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的//结点,只能调整树中结点指针的指向。//思路// 首先想一下中序遍历的大概代码结构(先处理左子树,再处理根结点,之后处理右子树),//假设左子树处理完了,就要处理根结点,而根结点必须知道左子树的最...原创 2019-11-24 23:33:14 · 72 阅读 · 0 评论 -
35_复杂链表的复制
package pers.lyt.java;//题目 // 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。//在复杂链表中,每个结点除了有一个m_pNext指针指向下一个点外,还有一个m_pSibling 指向//链表中的任意结点或者nullptr。//思路// 思路1:先复制结点,用next链接,最后根据原...原创 2019-11-24 23:31:49 · 71 阅读 · 0 评论