剑指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 · 82 阅读 · 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 · 691 阅读 · 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 · 70 阅读 · 0 评论 -
剑指offer 之 把数组排成最小的数
题意 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 做法 这种题必定是贪心类的题,那么核心问题就在于如何写比较器。回顾一下比较类型的排序算法,例如冒泡排序,通过比较器判断什么样的数据排在前面。 在本题中:两个字符串s1 = ba 和 s2 = b ,按照什么标准进行...原创 2019-02-25 15:51:32 · 116 阅读 · 0 评论 -
剑指offer 之 按之字形顺序打印二叉树 (加重点,记得回顾)
题意 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 解法 我自己的解法比较直白,应付笔试还行,但是面试上用我的方法肯定会被鄙视。这里介绍讨论区中大神的方法。 双向队列法 有下面几点值得学习 1)在返回ArrayList<ArrayList< Integer > > 这种双层L...原创 2019-03-01 09:22:48 · 117 阅读 · 0 评论 -
剑指offer 之 数组中只出现一次的数字
题意:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。 解法:遇到重复数字出现要想到异或,A^A = 0 , 0 ^ A= A ,我们把数组异或完,得到的是tot = num1 ^ num2 , 那么如何将他们区分开呢? 找出tot的二进制下,最左边的1的位置idx,那么这个1必定由其中的一个num提供。因此把idx位置为1的数都异或起来,最终得到的是...原创 2019-02-25 10:05:22 · 76 阅读 · 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 · 94 阅读 · 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 · 200 阅读 · 0 评论 -
剑指offer之 栈的压入、弹出序列
题目描述 给两个数组,第一个表示进栈顺序,第二个表示出栈顺序,问是否合法 解法 在每一次进栈的时候,都进行判断是否有出栈操作。维护一个队列,代表进栈的数,而判断成立的条件是,队列尾部的元素和出栈数组对应。那么删除队列尾部元素。最后判断队列是否为空。 public boolean IsPopOrder(int [] pushA,int [] popA) { List<Inte...原创 2019-01-24 12:18:18 · 73 阅读 · 0 评论 -
剑指offer之 包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 做法 这道题有点像单调队列/单调栈 维护两个栈s1、s2,第一个栈用于淳朴的压栈出栈,目的是保存输入的数据。 第二个栈用于存储栈中的最小值,也就是说第二个栈的栈顶永远是最小值。 压栈时:s1压栈,如果s2的栈顶元素 >= 当前数据,那么就压栈(保证栈定永远是最小值) 出栈时:当s...原创 2019-01-24 11:37:39 · 113 阅读 · 0 评论 -
剑指offer 之 二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 整型4个字节也就是32位。因此-2的反码: - 1111111…10 共有31个1。 先讲本人比较次的方法,根据反码的公式,可以看到负数反码中1的个数,其实和绝对值中0有关系。 只不过绝对值最后一个1后面的0都只能算一个。(说的比较乱,可以自己草稿)所以模拟这种思想即可。 不过-2147483648 -> 2...原创 2018-12-25 21:47:16 · 72 阅读 · 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 · 161 阅读 · 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 · 86 阅读 · 0 评论 -
剑指offer(十五)之 反转链表
单链表的反转有两种方式 这里讲的不错 第一种:原地旋转 核心思想就是原创 2018-12-21 17:45:27 · 96 阅读 · 0 评论 -
剑指offer(五)之 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路 个人的笨方法根大神的比还是差很多。。。 大神的方法:stack1用于push ,stack2 用于pop。分析pop的话,当stack2空了,那么要把stack1的数据搬过去。stack1的栈底,就会处于stack2的栈顶。(优先输出); 当stack2不为空,那么把stack2的栈定弹出即可。 ...原创 2018-12-20 11:13:41 · 92 阅读 · 0 评论 -
剑指offer(三)之从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 代码 /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val = val; * } * }...原创 2018-12-20 10:49:01 · 72 阅读 · 0 评论 -
剑指offer(二)之替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy 思路 不用开辟新空间的做法。 先计算出替换后的字符串总长度,维护新字符串的索引 j, 旧字符串的索引 i 。(新旧并不是说生成了新字符串,之前便于区分) 索引 i 从前往后读取字符串信息 索引 j 从后向前生成字符串,当索引 i 对...原创 2018-12-20 10:23:35 · 76 阅读 · 0 评论 -
剑指offer(一)之二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 思路来源讨论。。。 由于从上至下递增,从左至右递增 假定当前位置时 (i, j) 那么 a[ i-1 ] [ j ] < a [ i ] [ j ] (上面小) a[ i ] [j ...原创 2018-12-20 10:13:20 · 77 阅读 · 0 评论 -
剑指offer题目分类
转自 https://blog.csdn.net/Lollipop66/article/details/80854497 一、线性表 1、数组 思路总结:点击打开链接 面试题3:数组中重复的数字 面试题4:二维数组中的查找 面试题11. 旋转数组的最小数字 面试题21:调整数组顺序使得奇数位于偶数前面 面试题39:数组中出现超过一半的数字 面试题40:最小的k个数 面试题42:连续子数组的最大和 ...转载 2019-03-26 15:35:30 · 482 阅读 · 0 评论