剑指offer
剑指offer题解及思路
香农派我最爱
I'm vegetable!
展开
-
算法练习篇之:表示数值的字符串
算法练习篇之:表示数值的字符串 题目描述解题思路代码实现总结题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100″,”5e2″,”-123″,”3.1416″和”-1E-16″都表示数值。但是”12e”,”1a3.14″,”1.2.3″,”±5″和”12e+4.3″都不是。解题思路设置三个标志符分别记录“+/-”、“e/E”和“.”是否出现过。对于“...原创 2019-11-14 00:03:30 · 130 阅读 · 0 评论 -
算法练习篇之:数据流中的中位数
算法练习篇之:数据流中的中位数 题目描述解题思路代码实现总结题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题思路借助最大堆与最小堆来求解!最大...原创 2019-11-13 22:49:04 · 161 阅读 · 0 评论 -
算法练习篇之:反转单词顺序列
算法练习篇之:反转单词顺序列 题目描述解题思路代码实现总结题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一翻转这些...原创 2019-11-12 11:03:33 · 167 阅读 · 0 评论 -
算法练习篇之:不用加减乘除做加法
算法练习篇之:不用加减乘除做加法题目描述解题思路代码实现总结题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路依据题目意思,不能使用加减乘除,就对数字进行二进制位运算来求结果。我们举一个例子:5+7=12,第一步:逐位相加进行不进位运算,得出各位为2.第二步:算出进位为10,如果第一步进位为零,那么第一步相加即为最后结果!第三步,重复上述两个步骤...原创 2019-11-12 10:58:18 · 272 阅读 · 0 评论 -
算法练习篇之:求1+2+3+...+n
算法练习篇之:求1+2+3+...+n题目描述解题思路代码实现总结题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路累加不能用循环的话,那就试试递归吧。判断递归的终止条件不能用 if 和 switch,那就用短路与代替。(n > 0) && (sum += Sum...原创 2019-11-09 17:58:57 · 1937 阅读 · 0 评论 -
算法练习篇之:扑克牌顺子
算法练习篇之:扑克牌顺子 题目描述解题思路代码实现总结题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子……LL不高兴了,他想了想,决定大\小 王可以看成任何...原创 2019-11-09 17:55:02 · 585 阅读 · 0 评论 -
算法练习篇之:左右旋转字符串
算法练习篇之:左右旋转字符串 题目描述解题思路代码实现总结题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解题思路按照题目意思,相当于将一个...原创 2019-11-09 17:43:55 · 162 阅读 · 0 评论 -
算法练习篇之:和为S的两个数字
算法练习篇之:和为S的两个数字 题目描述解题思路代码实现总结题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解题思路法一:哈希法。两个数都是这个集合中的,用一个HashMap,它的 key 存储数S与当前数字的差,value 存储当前的数字,比如S=15, 当前的数为 4,则往 hashmap 中插入...原创 2019-11-07 23:37:36 · 215 阅读 · 0 评论 -
算法练习篇之:和为S的连续正数序列
算法练习篇之:和为S的连续正数序列 题目描述解题思路代码实现总结题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?...原创 2019-11-07 23:07:34 · 117 阅读 · 0 评论 -
算法练习篇之:整数中1出现的个数
算法练习篇之:整数中1出现的个数 题目描述解题思路代码实现总结题目描述求出1 ~ 13的整数中1出现的次数,并算出100~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解...原创 2019-11-04 16:38:02 · 693 阅读 · 0 评论 -
算法练习篇之:把数组排成最小的数
算法练习篇之:把数组排成最小的数 题目描述解题思路代码实现总结题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路先将数组转换成字符串数组,然后对字符串数组按照规则排序,最后将排好序的字符串数组拼接出来。排序规则如下(a,b分别对应两个不同的数字)...原创 2019-11-04 16:27:19 · 180 阅读 · 0 评论 -
算法练习篇之:丑数
算法练习篇之:丑数 题目描述解题思路代码实现总结题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路我们只求丑数,不要去管非丑数。每个丑数必然是由小于它的某个丑数乘以2,3或5得到的,这样我们把求得的丑数都保存下来,用之前的丑数分别乘以2,3,5,...原创 2019-11-04 16:19:56 · 914 阅读 · 0 评论 -
算法练习篇之:数组中出现次数超过一半的数字 (数组)
算法练习篇之:数组中出现次数超过一半的数字 (数组) 题目描述解题思路代码实现总结题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路法1:借助hashmap存储数组中每个数出现的次数,最后看是否有数字出现次数超过数组...原创 2019-11-02 23:53:02 · 158 阅读 · 0 评论 -
算法练习篇之:调整数组顺序使奇数位于偶数前面 (数组)
算法练习篇之:调整数组顺序使奇数位于偶数前面 (数组) 题目描述解题思路代码实现总结题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路设置两个指针p1和p2,分别指向数组的首和尾部,p1向后移动,而p2向前移动。那么在什么情况下p1,p2才能移动呢?题目...原创 2019-11-01 23:30:13 · 156 阅读 · 0 评论 -
算法练习篇之:字符串替换(字符串)
算法练习篇之:字符串替换(字符串) 题目描述解题思路代码实现总结题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路思路很简单,借助stringbuffer,逐个遍历,将其中为空格的字符替换为‘%20’即可!!!话不多说,直接上代码代码实现去博客设置页面,选择一款...原创 2019-11-01 17:42:39 · 1043 阅读 · 1 评论 -
算法练习篇之:数组中只出现一次的数字
算法练习篇之:数组中只出现一次的数字 题目描述解题思路代码实现总结题目描述一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解题思路法一:大家都能想到的HashMap法法二:异或法方法一大家或许都可以想到,今天重点将方法二,题目中说明除了两个数字外,其余均为成对出现!!!通过观察我们可以发现成对出现的数字异或结果为零!这么一来思路或许开朗很多...原创 2019-10-31 23:00:32 · 193 阅读 · 0 评论 -
算法练习篇之:数组中的逆序对
算法练习篇之:数组中的逆序对题目描述解题思路代码实现总结题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。即输出P%1000000007(数据过大时,取余)解题思路例如7,5,4,6可以划分为两段7,5和4,6两个子数组1.在7,5中求出逆序对,因为7大于5所...原创 2019-10-28 22:36:40 · 437 阅读 · 0 评论 -
算法练习篇之:数值的整数次方
算法练习篇之:数值的整数次方 题目描述解题思路代码实现总结题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路情况分为以下几种:1.底数、指数均大于零,则正常计算即可!1.指数为负时,可以先对指数求绝对值,算出次方的结果后再取倒数!2.当底数为0,指数为负时,会出现对0求倒数情况,要特殊处理3.0的0次方在...原创 2019-10-28 22:25:11 · 131 阅读 · 0 评论 -
算法练习篇之:二进制中1的个数
算法练习篇之:二进制中1的个数 题目描述解题思路代码实现总结题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,(如果最右边的1后面还有0的话)原来在1后面的所有的0都会变成1。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是...原创 2019-10-27 23:16:22 · 202 阅读 · 0 评论 -
算法练习篇之:连续子数组的最大和 (数组 )
算法练习篇之:连续子数组的最大和 (数组 )题目描述解题思路代码实现总结题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最...原创 2019-10-27 22:34:22 · 176 阅读 · 0 评论 -
算法练习篇之:字符串的排列 (字符串)
算法练习篇之:字符串的排列 (字符串)题目描述解题思路代码实现总结题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:解题思路我们求整个字符串的排列,其实可以看成两步:第一步求所有可能出现在第一个位置的字符(即把第一个字符和后面的所有字符交换[相同...原创 2019-10-25 23:29:00 · 197 阅读 · 0 评论 -
算法练习篇之:数字在排序数组中出现的次数 (数组)
算法练习篇之:数字在排序数组中出现的次数 (数组)题目描述解题思路代码实现总结题目描述统计一个数字在排序数组中出现的次数。解题思路一个巧妙的思路:首先在排序数组中查找,借助二分查找,之后因为数组中元素都是整数,那么我们在二分查找前提下,比如查找k出现的次数。我们可以查找k-0.5和k+0.5分别对用的下标位置,然后相减即为出现的次数!!!代码实现去博客设置页面,选择一款你喜欢的代码片高...原创 2019-10-25 21:39:07 · 154 阅读 · 0 评论 -
算法练习篇之:变态跳台阶
算法练习篇之:变态跳台阶题目描述解题思路代码实现总结题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路本题不同于之前跳台阶的题目,之前最多可以一次跳2个台阶,而本题所谓变态跳台阶,则一次最多可以跳n个台阶!!!我们先从一般情况举例:n = 1时,只有1种跳法,f(1) = 1n = 2时,会有2种跳的方式,一...原创 2019-10-25 20:30:33 · 218 阅读 · 0 评论 -
算法练习篇之:跳台阶
算法练习篇之:跳台阶题目描述解题思路代码实现总结题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路这种题目思想都是斐波那契数列,首先考虑最简单的情况。如果只有1级台阶,那么显然只有一种跳法。如果有2级台阶,那就有两种跳法:一种是分两次跳,每次跳1级,另外一种就是一次跳2级。考虑更为一般的情况时:我们把n级台...原创 2019-10-24 11:17:03 · 230 阅读 · 0 评论 -
算法练习篇之:覆盖矩阵(递归)
算法练习篇之:覆盖矩阵(递归)题目描述解题思路代码实现总结题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路假设先把2x8的覆盖方法结果称为f(8)。用第一个2x1小矩形去覆盖大矩形的最左边时有两种选择,竖着放或者横着放。当竖起来放的时候,右边还剩下2x7的区域,这种情形下的覆盖方法记为f(7)。接下...原创 2019-10-24 11:01:25 · 304 阅读 · 0 评论 -
算法练习篇之:旋转数组的最小数字(查找和排序)
算法练习篇之:旋转数组的最小数字(查找和排序)题目描述解题思路代码实现总结题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路数组本已是有序数组,旋转后则是前...原创 2019-10-24 10:49:12 · 160 阅读 · 0 评论 -
算法练习篇之:斐波那契数列(数组,动态规划)
算法练习篇之:斐波那契数列(数组,动态规划)题目描述解题思路代码实现总结题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路斐波那契数列定义:f(n) = n, (n <= 1)f(n) = f(n-1) + f(n-2), (n > 1)递归的思路非常简洁,但是很容易会出现stac...原创 2019-10-20 20:31:14 · 507 阅读 · 0 评论 -
算法练习篇之:机器人的运动范围 (数组)
算法练习篇之:机器人的运动范围 (数组)题目描述解题思路代码实现总结题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器...原创 2019-10-20 19:04:38 · 427 阅读 · 2 评论 -
算法练习篇之:矩阵中的路径 (数组)
算法练习篇之:矩阵中的路径 (数组)题目描述解题思路代码实现总结题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串...原创 2019-10-19 15:39:23 · 221 阅读 · 0 评论 -
算法练习篇之:第一个只出现一次的字符(字符串)
算法练习篇之:第一个只出现一次的字符(字符串)题目描述解题思路代码实现总结题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1。解题思路思路:借助HashMap,我们将字符串中每个字符作为key,出现次数作为value。遍历字符串时,每次先查询该字符在hashmap中是否已经存在,如果存在,则...原创 2019-10-18 21:10:48 · 179 阅读 · 0 评论 -
算法练习篇之:最小的k个数(链表)
算法练习篇之:最小的k个数(链表)题目描述解题思路代码实现总结题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解题思路法1:先对数组排序,然后取出前k个法2:利用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。方法一:思路十分简单,只需将数组进行排序即可,排序的方法快排,归并都是O(n...原创 2019-10-18 15:30:51 · 271 阅读 · 0 评论 -
算法练习篇之:滑动窗口的最大值 (数组)
算法练习篇之:滑动窗口的最大值 (数组)题目描述解题思路代码实现总结题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个:{[2,3,4],2,6,2,5,1}, {2,[...原创 2019-10-16 22:12:23 · 1225 阅读 · 0 评论 -
算法练习篇之:栈的压入、弹出序列 (栈)
算法练习篇之:栈的压入、弹出序列 (栈)题目描述解题思路图示代码实现总结题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路题目给...原创 2019-10-15 10:29:41 · 258 阅读 · 0 评论 -
算法练习篇之:包含min函数的栈 (栈)
算法练习篇之:包含min函数的栈 (栈)题目描述解题思路代码实现总结题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数(时间复杂度应为O(1))。解题思路本题中唯一要求是弹出栈的最小元素的复杂度为O(1),这个意思就是最小元素要始终在栈顶,直接弹出即可!这个需要借助一个临时栈来帮助我们实现,如果每次压入栈都需要先排序再弹出,这个复杂度明显不符合要求。思路如下:临时...原创 2019-10-14 22:19:26 · 143 阅读 · 0 评论 -
算法练习篇之:用两个栈实现队列(栈、队列)
算法练习篇之:用两个栈实现队列(栈、队列)题目描述解题思路图示代码实现总结题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。解题思路关于实现队列的插入和删除可以借助两个队列来实现:首先stack1:负责实现队列元素的插入,将所要插入的元素,按顺序依次压入stack1中,但是每次插入前,需要检查stack2是否有残留元素,如果有需要先将stack2中...原创 2019-10-14 11:02:04 · 226 阅读 · 0 评论 -
算法练习篇之:二叉树的第k个结点 (栈、树)
算法练习篇之:二叉树的第k个结点 (栈、树)题目描述解题思路图示代码实现总结题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。解题思路二叉搜索树按照中序遍历就是排好序的,所以,我们大可将二叉搜索树按照中序遍历,然后借助一个标记位查找第k个即可。依旧借助递归思想实现,主体代码十多行很简洁!图示代码实现...原创 2019-10-13 17:01:50 · 237 阅读 · 0 评论 -
算法练习篇之:序列化二叉树 (树)
算法练习篇之:序列化二叉树 (树)题目描述解题思路图示代码实现总结题目描述请实现两个函数,分别用来序列化和反序列化二叉树。解题思路序列化:顾名思义,将二叉树的节点转换成一组序列存储起来,我们可以采用前序遍历,结合递归的思想,每次将节点的值存放在stringBuffer中,如果为空则记为#,然后递归添加左子结点和右子节点,每个节点用**“,”作为分隔符**,方便反序列化使用。反序列化:序列...原创 2019-10-13 16:51:03 · 186 阅读 · 0 评论 -
算法练习篇之:二叉搜索树与双向链表(树、链表)
算法练习篇之:二叉搜索树与双向链表(树、链表)题目描述解题思路图示代码实现总结题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路题目给定二叉搜索树,二叉搜索树定义:左子树的值<根节点的值<右子树的值。如果保持链表为有序状态,那么需要借助中序遍历(左跟右),正符合二叉搜索树的特性,转换为链表后,原先指...原创 2019-10-12 11:01:11 · 157 阅读 · 0 评论 -
算法练习篇之:按之字形打印二叉树 (树、栈)
算法练习篇之:按之字形打印二叉树 (树、栈)题目描述解题思路图示代码实现总结题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解题思路题目要求,之字形打印,即每层打印顺序交替,首先依旧为按层输出,每层打印结果存放在arraylist中,最后再将各个层的结果都存放在arraylist中去。细...原创 2019-10-12 10:43:39 · 217 阅读 · 0 评论 -
算法练习篇之:把二叉树打印成行 (队列、树)
算法练习篇之:把二叉树打印成行 (队列、树)题目描述解题思路代码实现总结题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。解题思路题目思路与前述从上到下打印二叉树相同,唯一区别就是,前述是将结果打印为一行,本题要求将每层打印为一行!既然要将每层结果存放在一起,按层打印,那么每层结果可以存放在arraylist,然后将二叉树每个层的结果再存放在arraylist中去,其...原创 2019-10-12 10:30:11 · 189 阅读 · 0 评论