
剑指offer
2112222222222
这个作者很懒,什么都没留下…
展开
-
剑指offer(四)之 重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:前序遍历: 根左右中序遍历:左根右根据先序遍历就能获得根。中序遍历依据根可以把树一分为二,根的左子树必定在其左边,右子树必定在其右边。递归进...原创 2018-12-20 10:06:19 · 111 阅读 · 0 评论 -
站在二叉树的右边,打印看得到的结点
void fun(TreeNode head) { Queue<TreeNode> queue = new LinkedList<>(); queue.offer(null); queue.offer(head); while (!queue.isEmpty()) { TreeNode ...原创 2019-03-11 14:45:52 · 736 阅读 · 0 评论 -
剑指offer 之 和为S的连续正数序列
题意给出整型sum,问能求出多少连续序列之和等于sum,例如9 -> 45 , 234解法第一种:双指针,当双指针之间的和 tot == sum,low++,high++; 当 tot < sum,high++; 当tot > sum,low++; ArrayList<ArrayList<Integer>> res = new ArrayList...原创 2019-02-26 09:42:13 · 98 阅读 · 0 评论 -
剑指offer 之 把数组排成最小的数
题意输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。做法这种题必定是贪心类的题,那么核心问题就在于如何写比较器。回顾一下比较类型的排序算法,例如冒泡排序,通过比较器判断什么样的数据排在前面。在本题中:两个字符串s1 = ba 和 s2 = b ,按照什么标准进行...原创 2019-02-25 15:51:32 · 144 阅读 · 0 评论 -
剑指offer 之 按之字形顺序打印二叉树 (加重点,记得回顾)
题意请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解法我自己的解法比较直白,应付笔试还行,但是面试上用我的方法肯定会被鄙视。这里介绍讨论区中大神的方法。双向队列法有下面几点值得学习1)在返回ArrayList<ArrayList< Integer > > 这种双层L...原创 2019-03-01 09:22:48 · 161 阅读 · 0 评论 -
剑指offer 之 数组中只出现一次的数字
题意:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解法:遇到重复数字出现要想到异或,A^A = 0 , 0 ^ A= A ,我们把数组异或完,得到的是tot = num1 ^ num2 , 那么如何将他们区分开呢? 找出tot的二进制下,最左边的1的位置idx,那么这个1必定由其中的一个num提供。因此把idx位置为1的数都异或起来,最终得到的是...原创 2019-02-25 10:05:22 · 99 阅读 · 0 评论 -
剑指offer 之 数字在排序数组中出现的次数(外加二分总结)
题意统计一个数字在排序数组中出现的次数。做法二分,本道题有总巧妙的想法: 找出第一个大于 k -0.5 ,和第一个大于 k + 0.5 的位置。后面减前面即可。public int GetNumberOfK(int [] array , int k) { if(array == null || array.length == 0) return 0...原创 2019-02-25 09:15:30 · 120 阅读 · 0 评论 -
剑指offer 之 整数中1出现的次数(从1到n整数中1出现的次数)
理解了讨论区高票做法题目描述求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。做法先讨论百位,称遍历100.101.102…199 ...原创 2019-02-24 10:58:54 · 253 阅读 · 0 评论 -
剑指offer之 栈的压入、弹出序列
题目描述给两个数组,第一个表示进栈顺序,第二个表示出栈顺序,问是否合法解法在每一次进栈的时候,都进行判断是否有出栈操作。维护一个队列,代表进栈的数,而判断成立的条件是,队列尾部的元素和出栈数组对应。那么删除队列尾部元素。最后判断队列是否为空。 public boolean IsPopOrder(int [] pushA,int [] popA) { List<Inte...原创 2019-01-24 12:18:18 · 96 阅读 · 0 评论 -
剑指offer之 包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。做法这道题有点像单调队列/单调栈维护两个栈s1、s2,第一个栈用于淳朴的压栈出栈,目的是保存输入的数据。第二个栈用于存储栈中的最小值,也就是说第二个栈的栈顶永远是最小值。压栈时:s1压栈,如果s2的栈顶元素 >= 当前数据,那么就压栈(保证栈定永远是最小值)出栈时:当s...原创 2019-01-24 11:37:39 · 139 阅读 · 0 评论 -
剑指offer 之 二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路整型4个字节也就是32位。因此-2的反码: - 1111111…10 共有31个1。先讲本人比较次的方法,根据反码的公式,可以看到负数反码中1的个数,其实和绝对值中0有关系。 只不过绝对值最后一个1后面的0都只能算一个。(说的比较乱,可以自己草稿)所以模拟这种思想即可。不过-2147483648 -> 2...原创 2018-12-25 21:47:16 · 98 阅读 · 0 评论 -
剑指offer之变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。做法由于一次可以跳1、2、3、4…n节台阶,因此f(n) = f(n-1) + f(n-2) + f(n-3) + …f(n-n);把式子倒过来看就是f(n) = f(0) + f(1) + f(2) + …+f(n-2) + f(n-1) (1)那么f(n-1)...原创 2018-12-24 11:22:54 · 222 阅读 · 0 评论 -
剑指offer 之 链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路这里记录下牛客网大神的思想,通过两个指针p1、p2。p2到最后是要指向链表尾部的,而维护p1的位置处于p2前面的k位。就像一把尺子长度为k,当尺子后面一端抵住表尾时,那么尺子的头恰好时倒数第k位。非常的巧妙/*public class ListNode { int val; ListNode next = null;...原创 2018-12-28 21:47:23 · 114 阅读 · 0 评论 -
剑指offer(十五)之 反转链表
单链表的反转有两种方式 这里讲的不错第一种:原地旋转核心思想就是原创 2018-12-21 17:45:27 · 133 阅读 · 0 评论 -
剑指offer(五)之 用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路个人的笨方法根大神的比还是差很多。。。大神的方法:stack1用于push ,stack2 用于pop。分析pop的话,当stack2空了,那么要把stack1的数据搬过去。stack1的栈底,就会处于stack2的栈顶。(优先输出); 当stack2不为空,那么把stack2的栈定弹出即可。...原创 2018-12-20 11:13:41 · 115 阅读 · 0 评论 -
剑指offer(三)之从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。代码/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }...原创 2018-12-20 10:49:01 · 96 阅读 · 0 评论 -
剑指offer(二)之替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy思路不用开辟新空间的做法。先计算出替换后的字符串总长度,维护新字符串的索引 j, 旧字符串的索引 i 。(新旧并不是说生成了新字符串,之前便于区分)索引 i 从前往后读取字符串信息索引 j 从后向前生成字符串,当索引 i 对...原创 2018-12-20 10:23:35 · 99 阅读 · 0 评论 -
剑指offer(一)之二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:思路来源讨论。。。由于从上至下递增,从左至右递增假定当前位置时 (i, j)那么 a[ i-1 ] [ j ] < a [ i ] [ j ] (上面小)a[ i ] [j ...原创 2018-12-20 10:13:20 · 102 阅读 · 0 评论 -
剑指offer题目分类
转自 https://blog.youkuaiyun.com/Lollipop66/article/details/80854497一、线性表1、数组思路总结:点击打开链接面试题3:数组中重复的数字面试题4:二维数组中的查找面试题11. 旋转数组的最小数字面试题21:调整数组顺序使得奇数位于偶数前面面试题39:数组中出现超过一半的数字面试题40:最小的k个数面试题42:连续子数组的最大和...转载 2019-03-26 15:35:30 · 520 阅读 · 0 评论