用两个栈实现一个队列 常规解法:两个栈A和B,模拟队列,入队、出队操作 入队时,将元素压入A, 出队时,将A中元素逐个弹出并压入B,将B的栈顶元素弹出作为出队元素,之后将B中剩下的元素逐个弹出并压入A。一种小改进:入队时,先判断A是否为空,如果不为空,说明元素都在A,此时将入队元素直接进栈到A;如果为空,将B中元素弹出并进栈到A,然后在压入元素; 出队时,先判断B是否为空,如果不为空,直接弹出B栈栈顶元素;如果为空
后序遍历二叉树 递归方法和之前的几乎一致,不再赘述。考虑非递归方法: 后序遍历顺序是:左,右,根 即左孩子和右孩子都遍历输出了之后,才遍历子树的根节点。public ArrayList<Integer> postorderTraversal(TreeNode root) { ArrayList<Integer> lst = new ArrayList<Integer>();
二叉树中序遍历 中序遍历二叉树: 遍历顺序:左,根,右 首先遍历左子树,直到遇到第一个没有左子树的节点,输出,然后遍历右子树。递归算法比较简单,和先序遍历差别不大。public static List<Integer> inorderTraversal(TreeNode root) { if(root == null) return Collections.EMPTY_LIST;
先序遍历二叉树 递归方式先序遍历二叉树: 遍历顺序:根,左,右public static List<Integer> preorderTraversal(TreeNode root) { if(root == null) return Collections.EMPTY_LIST; List<Integer> list = new ArrayList<Int
LeetCode:Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.For example:Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, r
二叉树遍历实现:递归和非递归 上一个求二叉树公共祖先节点的题用到了后序遍历,临时想起来就总结一下,常见的二叉树遍历方式吧,主要有,先序遍历,中序遍历、后序遍历和层序遍历,每种遍历方式的实现主要有两种:递归和非递归。其中,非递归算法主要用到了栈和队列(层序遍历)代码如下,忘了的时候可以看看。import java.util.LinkedList;public class BinaryTree { //根节点 pr
LeetCode:Lowest Common Ancestor of a Binary Tree Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v a
LeetCode:Number of 1 Bits Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight).For example, the 32-bit integer ’11’ has binary representation 0000000000000
LeetCode:Single Number Given an array of integers, every element appears twice except for one. Find that single one.Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memo
LeetCode:Maximun Depth of Binary Tree二叉树深度 主要思路: (1)深度优先搜索DFS; (2)递归需要考虑的问题(递归结束条件,递归返回值) (3)算法简单,性能一般。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode rig
LeetCode: Spiral Matrix螺旋矩阵 基本思路: (1)模拟遍历过程 ①从左往右matrix[rowstart][i] ②从上往下matrix[i][colend] ③从右往左matrix[rowend][i] ④从下往上matrix[i][colstart] (2)判断结束条件; (3)记得输入合法性判
HashMap实现原理 面试的时候经常遇到会问某种Java集合的实现原理,觉得其中最长问到的应该是HashMap,所以详细学习一下。HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模
Java与C++的区别 ①编译运行过程不同(解释执行 + 跨平台)②面向对象(无全局变量和函数)③封装指针为引用类型(安全、需要考虑类型、跳转、初始值等)④不支持多继承(单继承 + 实现多接口)⑤内存管理(自动回收 v.s 析构函数)⑥没有运算符重载、平台无关性
Java引用和C指针的区别 ①引用是值为地址的数据元素,而指针是一个装地址的变量;②引用是有类型的,其类型转换可能不成功,指针只是一个地址;③引用的初始值是null,指针的初始值不一定;④引用不能直接计算,指针可以计算跳转;⑤引用不用主动回收,指针需要主动回收。
为什么使用序列化和反序列化 首先需要了解什么是序列化:一般程序运行时,产生对象,这些对象随着程序的停止而消失,但如果我们想把某些对象保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象,这种情况下就要用到对象的序列化。知道了序列化的作用,我们会想到,为什么要用序列化呢?一座大厦好比一个对象,你要把这座大厦搬到另一个地方去,你想直接挪肯定不行吧?(一般来说,
一个01发生器,产生0和1不均匀,怎么设计使得它产生均匀的01序列 1.有一个随机数发生器,能以概率p生成0,以概率1-p生成1,问如何做一个随机数发生器 使得生成0和1的概率相等。 2.用上面那个生成0和1的概率相等的随机数发生器,怎样做一个随机数发生器使得它生成 的数在1…N之间均匀分布。 第一题比较简单,可以用原发生器周期性地产生2个数,直到生成01或者10。 由于生成01和10的概率均为p(1-p),故预先任意指定01为0(或1),10为1(
判断有环的链表相交和第一个公共节点(全面) 最常见的解法: 单链表有公共节点,则必定是Y状而不是X状的。 遍历得到两个链表的长度,长链表长度m,短链表长度n,则长链表先走m-n步,然后两个链表同时逐步遍历,比较是否有相同节点。第二种方法: 将一个链表的表尾指向另一个链表的表头,如果两个链表相交,则会形成环,否则没有环,因此转换成判断是否有环,即通过快指针和慢指针,判断快慢指针是否相等判断是
单链表逆序--递归算法 非递归的单链表逆序比较简单,只需要注意三个问题: 1、保存从单链表上拆下的节点; 2、保存当前在链表上的节点,保证不断链; 3、判断循环结束条件。而基于递归的单链表逆序算法,需要注意两个问题:拆和装 因为本质上递归过程是一个逐层深入、逆序返回的过程,因此,只需要考虑两个条件,即逐层深入时候需要做什么操作和返回过程中需要做什
单链表逆序--非递归算法 初始状态: prev = null; head = head; next = head.next;//保证不断链 开始逆序: head.next = prev;//不会断链,next保持在链上(最后一个节点指向null) prev = head; head = next;
UseCase中include和extend的区别 比较基础的东西,不过还是说明一下:UML用例图中include与extend的区别最近上论坛,看到在争论UseCase中include与extend的区别。其实这两者是很容易区分的。include是指用例中的包含关系,通常发生在多个用例中,有可以提取出来的公共部分(就象提取公因式一样),例如UseCaseA中包括了a和b两个流程,而UseCaseC中包含了c和b两个流程。为了提高复