剑指offer
三棵石头
这个作者很懒,什么都没留下…
展开
-
【剑指offer】之字符串的组合
题目: 输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。分析: 假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;而是不把这个字符放到原创 2015-12-16 10:55:22 · 322 阅读 · 0 评论 -
【剑指offer】之链表倒数第k个节点
题目描述: 输入一个链表,输出该链表中倒数第k个结点。 (hint: 请务必使用链表。)分析: 定义两个指针,第一个先走k-1步,第二个跟上一起走,当第一个走到末尾时就是第二个走到了倒数第k个节点的时候,返回。(只需遍历一次链表)java代码实现: private static Node findNode(Lin原创 2015-12-23 10:43:09 · 327 阅读 · 0 评论 -
【剑指offer】之整数中1出现的次数
有两种解法,时间复杂度不同。java代码实现:/** 解法一 (时间复杂度为o(n)*lgn) * * * 最直观的方法,分别求得1到n中每个整数中1出现的次数。 * */ private static int printNumbersOfOne(int start, int end) { int sumOfone = 0; for(int i=原创 2015-12-04 10:21:40 · 261 阅读 · 0 评论 -
【剑指offer】之扑克牌的顺子
题目: 随机从一副扑克牌中抽出了5张牌,判断是否是顺子,即五张牌是不是连续的。大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。(本文不大、小王看做0)分析: java代码实现: private static boolean isContinuous(int[] numbers) { if(numbers == null原创 2015-12-03 09:21:19 · 377 阅读 · 0 评论 -
【剑指offer】之不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分析: java代码实现: private static int getSum(int num1, int num2) { int sum = 0; int add = 0; while(num2!=0) { sum =原创 2015-12-02 15:10:16 · 302 阅读 · 0 评论 -
【剑指offer】之把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。分析: 这道题主要要自定义一个比较方法myCompare(),这个方法比较的是两个数字不同组合的大小,例如:于数字m和n,比较其组合mn和nm的大小。使用原创 2015-11-27 11:03:44 · 445 阅读 · 0 评论 -
【剑指offer】之二叉树深度
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分析: java代码实现: public int TreeDeep(Node root) { if(root == null) return 0; int left = TreeDeep(root.left原创 2015-12-07 14:39:49 · 316 阅读 · 0 评论 -
【剑指offer】之数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。分析: 可以利用归并排序,只要在排序的过程中出现左边的值大于右边的值时打印出这对数字。(就是归并算法,只是多了一句打印的语句而已。)java代码实现 (时间复杂度o(n*lgn)): public static原创 2015-12-04 15:40:03 · 341 阅读 · 0 评论 -
【剑指offer】之数值的整数次方
题目描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。(不能使用库函数,不考虑大数问题)分析:(剑指offer上的分析) java代码实现: private static double power(double base, int exponent)原创 2015-12-24 13:52:52 · 316 阅读 · 0 评论 -
【剑指offer】之二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。例如输入9,输出应该是2.分析:有两种方法,第一种比较好想的到,第二种难一点。java代码实现: //第一种方法描述:为了不死循环,选择左移1,总共移32次判断整数的所有位的1的个数。 private static int numberOfone(int num)原创 2015-12-24 14:32:58 · 314 阅读 · 0 评论 -
【剑指offer】之青蛙跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析: 1)当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;....... 规律类似于Fibonacci数列原创 2015-12-24 15:49:32 · 371 阅读 · 0 评论 -
【剑指offer】之字符串转整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。分析: 这道题最主要的是要进行前面的无效判断,比如输入的是Null,输入时带有空格,输入的值有负号等。转换的过程中只要取出单一的字符减去'0'所得到的值就是该字符对应的int数值,然后循环乘以10再相加就可以得到整数。java代码:private static i原创 2015-12-02 09:24:20 · 243 阅读 · 0 评论 -
【剑指offer】之丑数
题目描述:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。分析:、 每一个丑数必然是由之前的某个丑数与2,3或5的乘积得到的,这样下一个丑数就用之前的丑数分别乘以2,3,5,找出这三种最小的并且大于当前最大丑数的值,即为下一个要求的丑原创 2015-12-04 14:31:04 · 285 阅读 · 0 评论 -
【剑指offer】之数组中只出现一次的数字
题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。(要求时间复杂度为o(n))分析: java代码实现: private static String FindnumAppearOnce(int []numbers) { String result = null; int result原创 2015-12-03 15:57:07 · 345 阅读 · 0 评论 -
【剑指offer】之左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!分析: 方法一,先求出左移一位的函数,然后就可以得出左移n位的函数。原创 2015-12-07 10:07:41 · 316 阅读 · 0 评论 -
【剑指offer】之反转链表
题目描述: 输入一个链表,反转链表后,输出链表的所有元素。(hint : 请务必使用链表)分析: 定义三个指针就能解决问题。java代码实现: //翻转链表,非递归算法 private static Node reverseList(LinkedList list) { Node header = li原创 2015-12-23 10:05:17 · 302 阅读 · 0 评论 -
【剑指offer】之合并两有序单链表
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。(hint: 请务必使用链表。)分析: 剑指offer上使用的是递归的算法,自己写了一个非递归的。java代码实现: private static LinkedList mergeList(LinkedList l原创 2015-12-23 09:37:54 · 317 阅读 · 0 评论 -
【剑指offer】之字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。java代码实现: /** * 方法描述:以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a, * 求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第原创 2015-12-15 09:23:48 · 299 阅读 · 0 评论 -
【剑指offer】之最小的k个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。分析: java代码实现: //求出最小的k个值(时间复杂度o(n)) private static void getLeastNumbers(int []nums, int k) { int []obs原创 2015-12-11 13:57:46 · 322 阅读 · 0 评论 -
【剑指offer】之删除在另一个字符串中出现的字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。分析:两种方法(java实现) private static String deleteChars(String str1,String str2) { char[] chars1 = ge原创 2015-12-08 16:39:44 · 460 阅读 · 0 评论 -
【剑指offer】之二叉搜索树转双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。分析: 思路:这道题目关键在于不能创建新的节点,如不然,我们可以直接将二叉排序树中序遍历保存到一个数组中,而后再建立一个双性链表,将数据保存到双向链表里。 这里不能创建新节点,我们只能改变节点的指向左右子树的节点,让其变为原创 2015-12-14 15:15:51 · 448 阅读 · 0 评论 -
程序员代码面试指南:IT名企算法与数据结构题目最优解(题目)
第1章 栈和队列 设计一个有getMin功能的栈(士 ★☆☆☆) 由两个栈组成的队列(尉 ★★☆☆) 如何仅用递归函数和栈操作逆序一个栈(尉 ★★☆☆) 猫狗队列(士 ★☆☆☆) 用一个栈实现另一个栈的排序(士 ★☆☆☆) 用栈来求解汉诺塔问题(校 ★★★☆) 生成窗口**值数组(尉 ★★☆☆) 构造数组的MaxTree(校 ★★★☆) 求**子矩阵的大小(校原创 2015-12-12 08:46:14 · 3455 阅读 · 0 评论 -
【剑指offer】之第一个只出现一次的字符
题目描述:在一个字符串中找到第一个只出现一次的字符。比如输入“abacceff”,输出“b”。分析: /** * * 利用哈希表算法,扫描两次字符串,第一次记录相同位置的字符出现的次数,第二次找到第一个次数为1的字符并返回。时间复杂度为o(n)。 */ private static char findChar(String str) {原创 2015-12-09 17:16:03 · 351 阅读 · 0 评论 -
【剑指offer】之出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。分析: 可以考虑在遍历数组时保存两个值:一个是数组中的一个数字,一个是次数,。当遍历到下一个数字时,如果下一个数字与之前保存的数字相同,则次数加1,如果不同,则次数减1原创 2015-12-11 15:11:10 · 359 阅读 · 0 评论 -
【剑指offer】之连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会原创 2015-12-10 14:28:24 · 942 阅读 · 2 评论 -
【剑指offer】之栈的压入弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。分析: 剑指offer上的分析 ja原创 2015-12-21 09:59:56 · 370 阅读 · 0 评论 -
【剑指offer】之包含min函数的栈
题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求时间复杂度为o(1)。分析: 提供一个辅助栈,入栈的时候比较顶元素,如果小于则入栈该值,如果大于或等于则入栈栈顶元素;出栈操作的时候,同时出栈。java代码实现: import java.util.Stack;public clas原创 2015-12-21 10:30:16 · 364 阅读 · 0 评论 -
【剑指offer】之顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.分析: 先求出打印一圈的函数,在把矩阵分成若干个圈来打印。java代码实原创 2015-12-21 11:39:58 · 378 阅读 · 0 评论 -
【剑指offer】之二叉树的镜像
题目描述:输入一个二叉树,输出其镜像。分析: 左右子树互换,java代码实现: //二叉树的镜像 public void mirror(Node root) { if(root==null || root.left==null || root.right==null)原创 2015-12-22 09:07:34 · 353 阅读 · 0 评论 -
【剑指offer】之树的子结构
题目描述: 输入两颗二叉树A,B,判断B是不是A的子结构。如下图: 分析: 第一步在A树中查找与B子树跟节点一样的节点,第二步判断跟节点一样的A树节点的结构是否与B中的结构一样。java代码实现: //判断子树2是否是树1的子树 public boolean isSubTree(Node roo原创 2015-12-22 09:54:53 · 406 阅读 · 0 评论 -
【剑指offer】之调整数组顺序
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。分析: 利用快速排序的思路,前后扫描数组,如果前面发现偶数,则与后面发现的奇数交换位置。java代码实现: //方法描述:奇数位于前半部分,原创 2015-12-22 15:04:18 · 287 阅读 · 0 评论 -
【剑指offer】之约瑟夫环问题
题目描述:每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为JOBDU的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为1的小朋友开始报数。每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续1...m报数.原创 2015-12-03 08:42:19 · 616 阅读 · 1 评论