剑指offer
文章平均质量分 65
cosmos_lee
这个作者很懒,什么都没留下…
展开
-
剑指offer: 把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:两个数 a, b 如果 ab > ba 那么a放在前面好 如果ba>ab那么b放在前面好 如果ab=ba那么a,b相等实现:利用了Java 中 数...原创 2018-03-06 23:05:05 · 180 阅读 · 0 评论 -
剑指offer:不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路(参考牛客讨论区):首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步走的方式...原创 2018-03-19 21:10:48 · 121 阅读 · 0 评论 -
剑指offer:二叉搜索树的第k个结点
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。思路:利用树的中序遍历的非递归方法,因为二叉搜索树的性质,使用中序遍历是从小变大。树的遍历的非递归还是需要记下的。代码: TreeNode KthNode(TreeNode pRoot, int k) { Stack&...原创 2018-03-13 21:16:54 · 117 阅读 · 0 评论 -
剑指offer:链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点。思路:这个思路是看到的牛客网讨论区的,很清晰,所以贴过来了。假设x为环前面的路程(黑色路程),a为环入口到相遇点的路程(蓝色路程,假设顺时针走), c为环的长度(蓝色+橙色路程)当快慢指针相遇的时候:此时慢指针走的路程为Sslow = x + m * c + a快指针走的路程为Sfast = x + n * c + a2 Sslow = Sfa...原创 2018-03-13 21:53:53 · 137 阅读 · 0 评论 -
剑指offer:机器人的运动范围
题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路:一开始的思路是回溯法,后来发现这道题每个格子...原创 2018-03-24 18:57:01 · 157 阅读 · 0 评论 -
剑指offer:搜索二维矩阵
写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数。这个矩阵具有以下特性:每行中的整数从左到右是排序的。每一列的整数从上到下是排序的。在每一行或每一列中没有重复的整数。思路:参考剑指offer:从右上角顶点算起,先比较列,如果当前元素大于target,则col--;然后开始比较行,如果当前元素小于target,则row++。代码: public static int search...原创 2018-03-31 15:38:28 · 189 阅读 · 0 评论 -
lintcode之快速幂
先来看看剑指offer里面的这道题:题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。pow(base, exponent)思路:初始思路:首先,对于exponent<0的情况下,可以先将 exponent取绝对值,然后在对结果取倒数,如果此时base为0,抛出异常。进阶思路:如果exponent=32,那么我们只需要知道e...原创 2018-04-09 09:32:28 · 137 阅读 · 0 评论 -
排序算法之归并排序(Merge_Sort)
归并 的 含义 “将两个或两个以上的有序表合成一个新的有序表”merge的思想 : 先将A1[ ],A2[ ] 复制到辅助数组 B[ ]中,每次取较小者放入A中,直至B的某一段为空时,将另一端直接复制到A中。Java代码:public void mergesort(int[] arr, int first, int mid, int last, int[] temp){ int ...原创 2018-03-27 10:54:18 · 287 阅读 · 0 评论 -
二叉树的三种遍历的递归和非递归的总结(详细,有推导)java
之前已经总结过二叉树的层序遍历:https://blog.csdn.net/u012156116/article/details/79393851今天来探讨下二叉树的三种常见遍历的 递归,非递归 过程,其中非递归的推导过程可见最后的图:1. 先序1.1 递归三种遍历方式的递归算法大同小异,只是打印节点的位置不一样,很简洁。 public void pre_traversal_1(TreeNo...原创 2018-04-03 12:56:51 · 551 阅读 · 0 评论 -
剑指offe:顺时针打印矩阵(最优解)——Array
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:1. 对于一个矩阵,左上角的点跟右下角的点可以唯一的标识一个矩阵,左上角的点(tr,tc),右下角的点(dr,dc)。2. 一...原创 2018-03-28 18:35:17 · 162 阅读 · 0 评论 -
剑指offer:将数组重新排序以构造最小值
给定一个整数数组,请将其重新排序,以构造最小值。 注意事项The result may be very large, so you need to return a string instead of an integer.样例给定 [3, 32, 321],通过将数组重新排序,可构造 6 个可能性数字:3+32+321=3323213+321+32=33213232+3+321=323321...原创 2018-04-18 10:37:15 · 170 阅读 · 0 评论 -
剑指offer:将二叉查找树转换成双链表
题目:将一个二叉查找树按照中序遍历转换成双向链表。样例给定一个二叉查找树: 4 / \ 2 5 / \1 3返回 1<->2<->3<->4<->5。思路:利用中序遍历的非递归模式,依次将双链表连起来就好了。有关非递归的遍历,可见:https://blog.csdn.net/u012156116/article/deta...原创 2018-04-12 20:07:07 · 144 阅读 · 0 评论 -
剑指offer:第k大元素
第k大元素 给出数组 [9,3,2,4,8],第三大的元素是 4给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推 这是一道非常重要的笔试题,思路有三:1. 最直观的,就是排下序,取第k大的元素就行了。但是时间复杂度有点高, O(nlgn)2.利用类似于快速排序中的分治法,每次找到首元素(随意,这里设为首元素)应该在...原创 2018-04-18 16:22:17 · 680 阅读 · 0 评论 -
剑指offer:数组中只出现一次的数字 || lintcode:落单的数
剑指offer:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。lintcode:给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。样例给出 [1,2,2,1,3,4,3],返回 4思路:1. 使用hashmap,用空间换时间:剑指offer代码: public void FindNumsAppearOnce(i...原创 2018-04-19 20:15:13 · 223 阅读 · 0 评论 -
Lintcode: Serialize and Deserialize Binary Tre & 剑指offer:序列化、反序列化二叉树
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。样例给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构: 3 / \9 20 / \ 15 7...原创 2018-05-03 10:38:53 · 159 阅读 · 0 评论 -
剑指offer:构建乘积数组 ---- lintcode:数组剔除元素后的乘积
题目:给定一个整数数组A。定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法。样例给出A=[1, 2, 3],返回 B为[6, 3, 2]思路:分别再定义两个数组C,D,保存的是 A[0] * ... * A[i-1] ...原创 2018-04-25 12:52:19 · 114 阅读 · 0 评论 -
剑指offer:最小的K个数(重要)
题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:这道题有两种解法,一种是O(N)的,一种是O(NlgN)的,但是O(N)的需要修改原数组。下面先介绍第一种方法:1.在上篇博客里面我们已经复习了快速排序的过程,首先通过partition()来找到第一个元素实际的位置,实际上这种方法也可以用在我们这道题中,每次par...原创 2018-03-05 23:04:15 · 99 阅读 · 0 评论 -
排序算法之堆排序(HeapSort)
rt原创 2018-03-05 23:03:12 · 141 阅读 · 0 评论 -
关于在线编程做题时的一些规范
转载:http://blog.csdn.net/maoyeqiu/article/details/520625611.注意要引入包和输出:import java.util.Scanner; public class Main { public static int getIntFromDouble(double a){ return (int...转载 2018-02-27 16:52:02 · 183 阅读 · 0 评论 -
剑指offer: 从上往下层序打印二叉树
描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:相当于进行二叉树的宽度优先遍历需要新建一个队列,打印每一层时,将这一层的孩子节点添加到队列中,这样以此往复。最后将队列中的元素全部输出。(值得注意的是,Java中Queue接口没有了isempty()方法,但是LinkedList类有size()方法,所以使用这个来判断队列是否为空)import java.util.ArrayLis...原创 2018-02-27 22:16:12 · 203 阅读 · 0 评论 -
剑指offer:判断一个树是否时平衡二叉树
题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:1.最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。 12345678910111213141516public classSolution { public boolean IsBalanced_Solution(TreeNode root) { ...原创 2018-03-08 15:31:26 · 139 阅读 · 0 评论 -
剑指offer:删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:1. 新建一个head指针,指向头部,方便第一个节点与第二个节点相同2. 新建pre指针,指向当前确定合理的节点上,新建last指针,为工作指针,判断是否前后节点是否...原创 2018-03-14 22:11:22 · 102 阅读 · 0 评论 -
剑指offer:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:作为一个二叉搜索树,它的左孩子节点必然要小于它的根节点,它的右孩子节点大于它的根节点,并且它的左子树和右子树都要满足这个规则。所以我们可以使用递归来实现。public class Solution { public boolean Verif...原创 2018-02-28 19:55:04 · 110 阅读 · 0 评论 -
剑指offer:二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。/*** 思路:一开始的思路是利用二叉树的深度优先遍历,利用一个栈来保存路径,每次返回时,* 就把这个节点在路径中去掉。* 但是java中用栈实现起来太烦了,参考下别人的代码,利用集合类的clone()方法,即原型模式,* 每个...原创 2018-03-01 21:29:19 · 91 阅读 · 0 评论 -
剑指offer:复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)第一遍思路:很简单粗暴,先复制next指针后面的节点,先把链表复制下来,然后遍历原复杂链表,将random指针依次相对应。/*public class RandomListNod...原创 2018-03-02 10:00:13 · 109 阅读 · 0 评论 -
剑指offer:和为S的连续正数序列
题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序列内按照...原创 2018-03-10 15:07:19 · 95 阅读 · 0 评论 -
排序算法之快速排序(quick_sort)
快速排序时交换排序的一种,交换排序还有冒泡排序。快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。此时解决方案可以随机打乱序列的顺序。快速排序不是一种稳定的排序,在于high指针在往左移动的过程中与中枢元素交换的时候会改变相对顺序。如:49 29 38 49 20 97 76思路:1)选择一个基准元素,通...原创 2018-03-04 16:31:23 · 334 阅读 · 0 评论 -
剑指offer:滑动窗口的最大值:详细
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,...原创 2018-03-17 20:38:13 · 247 阅读 · 0 评论 -
剑指offer:调整数组顺序使奇数位于偶数前面(两种情况)
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:1.如果要求的相对位置不变的话,那么可以头部一个指针,尾部一个指针,然后头部是偶数时,尾部是奇数时,交换。但是这种方法并不能保证相对位置不变。Java代码: public void reOrderArray(...原创 2018-03-17 21:27:19 · 160 阅读 · 0 评论 -
剑指offer之字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:怎么样循环打印几个字符的排列,可以这样想:每一个位置上每个字符都要出现一次,那么可以采用回溯法来解决,如下:把一串字符分为以下两个部...原创 2018-03-04 21:34:47 · 170 阅读 · 0 评论 -
剑指offer:整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。思路:参考nowcoder网友:/*设N = abcde ,其中abcde分别为十进制中各位上的数字。如果...原创 2018-03-22 17:05:54 · 185 阅读 · 0 评论 -
剑指offer:左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:先得到字符串的长度,然后算出有效左移的位数,然后新建一个char数组,最后融合。可能不是最优的方...原创 2018-03-12 23:03:03 · 82 阅读 · 0 评论 -
剑指offer:翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路: 先用一个栈保存每个单...原创 2018-03-12 23:06:08 · 111 阅读 · 0 评论 -
剑指offer:序列化二叉树。
题目描述请实现两个函数,分别用来序列化和反序列化二叉树思路:可以用树的先序遍历树,依次保存。但是要注意的时, 空节点使用“ #! ”来保存,正常节点用“A!” 来保存。Java代码:public class Serialize_tree { public static String serialize(TreeNode root) { // write...原创 2018-03-12 23:07:53 · 92 阅读 · 0 评论