
剑指offer
西八没天台
这个作者很懒,什么都没留下…
展开
-
剑指offer之重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:二叉树的先序遍历中,第一个数字是根节点的值。通过根节点的值,能够将中序遍历划分为左子树和右子树两个部分。然后递归左子树和右子树。原创 2017-09-10 18:55:29 · 189 阅读 · 0 评论 -
剑指offer之构建乘积数组
题目描述:给定一个数组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]。不能使用除法思路:开辟一个跟给定数组长度一样的数组,遍历两遍给定的数组,第一遍计算A[0]到A[i-1]的乘积;第二遍计算A[i+1]到A[A.length-1]的乘积,并与第一遍所原创 2017-10-03 00:46:24 · 204 阅读 · 0 评论 -
剑指offer之把字符串转换成整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0思路:将string转换为char数组,先判断第一个字符是否为‘-’或‘+’;之后就遍历char数组将字符转换为数字,注意的一点是0的ASCLL码为48,每次累加都应该减去。代码:public static int StrT原创 2017-10-04 00:53:40 · 229 阅读 · 0 评论 -
剑指offer之左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”思路:将string转换为char数组,然后翻转char字符数组,先翻转前半部分,接着翻转后半部分,最后整体翻原创 2017-10-04 14:18:08 · 221 阅读 · 0 评论 -
剑指offer之和为S的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出:对应每个测试案例,输出两个数,小的先输出。思路:既然数组是排好序的,可以采用左右夹逼的做法,找出和为S的两个数;然后,第一组和为S的两个数相乘肯定最小,因为两个数相加和相等,两数距离越远,乘积将会是越小的。代码:原创 2017-10-05 00:51:49 · 218 阅读 · 0 评论 -
剑指offer之连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度原创 2017-10-05 01:10:52 · 198 阅读 · 0 评论 -
剑指offer之调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:类似选择排序,遍历每个元素,遇到奇数,就从这个奇数开始向前遍历,使其前面的偶数向后覆盖,在遍历过程中直到遇上奇数或者到达第一个元素,结束遍历,最后将奇数放入正确位置原创 2017-10-12 00:45:02 · 245 阅读 · 0 评论 -
剑指offer之二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:每次target跟右上角的元素比较,如果和右上角元素相等,那么返回true;如果小于右上角元素,说明在下一行,如果大于右上角元素,说明在左一列;就这样不断缩小范围,直到找到或者找不到为止原创 2017-10-12 20:52:09 · 255 阅读 · 0 评论 -
剑指offer之旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:对于旋转数组,使用二分法来查找最小元素。取中间mid元素,如果array[mid]>array[end],说明最小元素应该在mid的右边,因为我们实际原创 2017-10-12 21:37:23 · 243 阅读 · 0 评论 -
剑指offer之数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路:利用数组本身的特性,如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之原创 2017-10-10 12:55:47 · 332 阅读 · 0 评论 -
剑指offer之和为S的连续正数序列
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck! (输出所有和为S的连续正数序列。序列内按照原创 2017-10-10 10:37:34 · 246 阅读 · 0 评论 -
剑指offer之青蛙变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。public class Solution { public int JumpFloorII(int target) { return 1<<--target; }}f(n)=2^(n-1);原创 2017-09-06 22:22:17 · 247 阅读 · 0 评论 -
剑指offer之二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。public static int NumberOf1(int n) { int count = 0; while (n != 0) { ++count; n = (n - 1) & n; } return count;}n&(n-1)每次消除最右边一个1原创 2017-09-06 22:54:42 · 221 阅读 · 0 评论 -
剑指offer之丑数
题目描述:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:起始元素为1,分别乘以2,3,5,计算出最小的,然后将最小的入栈,直到要求的那个元素为止;丑数的特点是后面的每个丑数都可以由前面的某一个丑数乘以2或3或5得到。代原创 2017-10-06 22:07:52 · 197 阅读 · 0 评论 -
剑指offer之把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面,原创 2017-10-06 23:06:19 · 184 阅读 · 0 评论 -
剑指offer之最小的K个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:利用快速排序的中间过程,判断基准元素所处的位置的下标是否为K-1。代码:public static ArrayList GetLeastNumbers_Solution(int [] input,原创 2017-10-09 12:43:48 · 238 阅读 · 0 评论 -
剑指offer之第一个只出现一次的字符
题目描述:在一个字符串(1思路:开辟一个26长度的数组存放每个字符出现的次数,之后遍历字符串找出第一个只出现一次的的字符代码:public class Main { public static void main(String[] args) { String str="DFUYSDIUVJUIRX"; System.out.prin原创 2017-10-09 13:16:25 · 187 阅读 · 0 评论 -
剑指offer之数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出重复的数字2或者3。思路:创建一个新的数组判断原数组中数字出现的次数代码:public cla原创 2017-10-09 19:56:43 · 252 阅读 · 0 评论 -
剑指offer之找出字符串中第一个重复的字符
题目描述:输入一个String的字符串,输出第一个重复的字符。比如输入“abcdeea”,输出的为e。思路:遍历String字符串,判断每个字符出现的次数。代码:public class Main { public static void main(String[] args) { String str="abcdeea"; in原创 2017-10-01 23:11:17 · 514 阅读 · 0 评论 -
剑指offer之斐波那契数列
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。思路:用循环,最好不要用递归代码:public static int Fibonacci(int n) { if(n==0||n==1) return n; int perNum=1; int perPerNum=0; int re原创 2017-10-12 22:17:49 · 233 阅读 · 0 评论