<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Mars.的专栏]]></title><description><![CDATA[Courage is going from failure to failure without losing enthusiasm.]]></description><link>https://blog.youkuaiyun.com/wangbingcsu</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wangbingcsu]]></copyright><item><title><![CDATA[重构二叉树（Java实现）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/51372695</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/51372695</guid><author>wangbingcsu</author><pubDate>Wed, 11 May 2016 11:02:13 +0800</pubDate><description><![CDATA[之前写过二叉树重构的C++实现，下面的是Java实现基本原理还是递归。package com.mars.binaryree;import java.util.Arrays;/**
 * 二叉树重构
 * @author Mars
 *
 */public class Solution {    public static void main(String[] args) {
        int[]]></description><category></category></item><item><title><![CDATA[无序数组中找到第K小的数（或者找到最小的K个数）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/51241283</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/51241283</guid><author>wangbingcsu</author><pubDate>Mon, 25 Apr 2016 12:15:47 +0800</pubDate><description><![CDATA[题目：在一个很大的无序数组中用最快的速度找到第K小的数（或者找到最小的前K个数）。（类似于，在一个有1000000个数的数组中找到最小的100个数）对于这个问题首先想到的可能是把这个数组进行按从小到大排序，排序完以后就可以直接确定第K小的数字了。但是，这样够快吗？假设我们是先对数组进行排序，那么肯定会选择最快的排序算法，对于庞大的数组首选当然是快速排序，而且是随机快速排序。现在考虑整个快速排序的过程]]></description><category></category></item><item><title><![CDATA[找出局部有序数组的最大值]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/51236173</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/51236173</guid><author>wangbingcsu</author><pubDate>Sun, 24 Apr 2016 21:50:03 +0800</pubDate><description><![CDATA[题目：将一个有序数组arr[n]的前面一段arr[0…..k]移动到数组的末尾，找出新数组的最大值。比如：int[] arr1 = {1, 5, 10, 20, 25, 30, 35, 50, 60, 70, 80, 100, 120, 150, 200};
int[] arr2 = {5, 10, 20, 25, 30, 35, 50, 60, 70, 80, 100, 120, 150, 200]]></description><category></category></item><item><title><![CDATA[二叉搜索树中找出比K大的最小的那个数]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/51235766</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/51235766</guid><author>wangbingcsu</author><pubDate>Sun, 24 Apr 2016 21:00:22 +0800</pubDate><description><![CDATA[这是一道面试的算法题，题目不难，但是在面试的时候是要求直接在白板上写程序，感觉自己还是弱爆了。第一次体验这种面试方式，虽然被虐，但是感觉还是挺好的，这方面的经验还是需要积累。题目： 在一个二叉搜索树种查找比某个数（K）大数中最小的那个。先把二叉树相关的构造代码贴上，下面是二叉树的节点定义。/**
*节点
*/
public class Node {
    private int data;]]></description><category></category></item><item><title><![CDATA[Java并发编程实战学习笔记（三）-线程封闭]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/50529815</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/50529815</guid><author>wangbingcsu</author><pubDate>Mon, 18 Jan 2016 13:22:20 +0800</pubDate><description><![CDATA[当访问共享数据时，通常需要使用同步。一种可以避免使用同步的方式就是不共享数据，如果仅在单线程内访问数据就不需要同步。这种技术被称为线程封闭。

1.  Ad-hoc线程封闭 
Ad-hoc线程封闭指的是，维护线程封闭性的职责完全由程序来承担。Ad-hoc线程封闭是非常脆弱的，因为没有任何一种语言特性，例如可见性修饰符或局部变量，能将对象封闭到目标线程上。事实上，对线程封闭对象（例如，GUI应用程序]]></description><category></category></item><item><title><![CDATA[Java并发编程实战学习笔记（一）-线程安全性]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/50525517</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/50525517</guid><author>wangbingcsu</author><pubDate>Fri, 15 Jan 2016 19:22:41 +0800</pubDate><description><![CDATA[编写线程安全的代码的核心是要对状态访问操作进行管理，尤其是对共享的和可变的状态访问。 
这里的对象的状态可以看成是存储在状态变量（例如实例或静态域）中的数据。1.什么是线程安全线程安全性定义中最核心的是概念是正确性。 
正确性的含义是：某个类的行为和规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象，以及定义各种后验条件来描述对象操作的结果。 
在正确性定义的基础上，线程安全性的定义：当]]></description><category></category></item><item><title><![CDATA[浙大PAT（PAT Basic Level） 1045—— 快速排序]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/49531561</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/49531561</guid><author>wangbingcsu</author><pubDate>Sat, 31 Oct 2015 11:17:34 +0800</pubDate><description><![CDATA[今天在浙大PAT里面看到了这一题，通过过滤挺低的，就像挑战下，毕竟只是Basic Level 嘛！ 看到题目以为是用快速排序解决问题，后来只被题目忽悠了。废话不多说，直接上题目：题目 
 著名的快速排序算法里有一个经典的划分过程：我们通常采用某种方法取一个元素作为主元，通过交换，把比主元小的元素放到它的左边，比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列，请问有多少个元素可能是]]></description><category></category></item><item><title><![CDATA[THU数据结构编程作业一：真二叉树重构(Proper Rebuild)]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/49495309</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/49495309</guid><author>wangbingcsu</author><pubDate>Thu, 29 Oct 2015 20:07:56 +0800</pubDate><description><![CDATA[本题是对二叉树进行重构，与普通的二叉树重构不同的是本题是针对特殊的二叉树——真二叉树进行重构。 
对于普通的二叉树我们知道可以通过 中序遍历+ 前序遍历/后序遍历 完成重构，并且如果仅已知前序遍历和后续遍历无法对一颗普通二叉树进行重构（可以简单理解为当某节点只有一个孩子节点的时候无法判断该孩子节点是左孩子还是右孩子），之前的博客已经进行了整理。但是如果对于一颗真二叉树在仅知道前序遍历和后序遍历的情况]]></description><category></category></item><item><title><![CDATA[数据结构与算法学习笔记——二叉树重构（递归）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/49430375</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/49430375</guid><author>wangbingcsu</author><pubDate>Mon, 26 Oct 2015 22:38:11 +0800</pubDate><description><![CDATA[关于二叉树的另外一个重要内容就二叉树的重构，二叉树的重构就是根据已知的二叉树前序，中序，后续遍历的数组重新构造出园二叉树。 
对于普通的二叉树可以由 前序遍历+中序遍历 或者 后序遍历+中序遍历 重构(注意：二叉树各节点不能有相同值)。 
对于只知道 前序遍历和后续遍历是否可以进行二叉树重构呢？对于普通二叉树以上两个条件是无法重构二叉树的，比如：   1             1]]></description><category></category></item><item><title><![CDATA[数据结构与算法学习笔记——二叉树遍历（二）（Morris Traversal）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/49425195</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/49425195</guid><author>wangbingcsu</author><pubDate>Mon, 26 Oct 2015 17:15:00 +0800</pubDate><description><![CDATA[前面介绍了一般的二叉树遍历方法，包括递归和迭代。这两种方法的空间复杂度都是O(n)。 
二叉树遍历的另外一种方法：Morris遍历二叉树 的空间复杂度为O(1)，并且还不改变原本的树结构，时间复杂度依然为O(n)。Morris的核心是利用叶子节点的空闲右孩子指针返回到根节点。中序遍历最初Morris是为中序遍历二叉树提出的方法，在中序的基础上可实现先序和后续遍历，这里先整理中序遍历。 
中序遍历的顺]]></description><category></category></item><item><title><![CDATA[数据结构与算法学习笔记——二叉树遍历（一）（递归、迭代）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/49423643</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/49423643</guid><author>wangbingcsu</author><pubDate>Mon, 26 Oct 2015 15:52:19 +0800</pubDate><description><![CDATA[最近学习二叉树相关的内容，个人认为其中最重要的应该就是二叉树的遍历了，包括先序，中序，后续。通常二叉树的遍历有三种方法：递归、迭代和Morris遍历。递归应该是最容易理解了， Morris遍历最难理解。关于Morris遍历后面会单独再整理。
节点的定义
struct Node{
    int data;
    Node *parent, *left, *right;
    Node(in]]></description><category></category></item><item><title><![CDATA[THU数据结构编程作业一：隧道（Tunel）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/49226589</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/49226589</guid><author>wangbingcsu</author><pubDate>Sun, 18 Oct 2015 11:37:01 +0800</pubDate><description><![CDATA[本题主要解决的问题： 
常数时间复杂度范围内获得栈的最大值； 
用两个栈模拟一个队列。 
细节问题：scanf 和 getchar 获取输入的问题。 
问题描述 
现有一条单向单车道隧道，每一辆车从隧道的一端驶入，另一端驶出，不允许超车。该隧道对车辆的高度有一定限制，在任意时刻，管理员希望知道此时隧道中最高车辆的高度是多少。 
现在请你维护这条隧道的车辆进出记录，并支持查询最高车辆的功能输入 
第一]]></description><category></category></item><item><title><![CDATA[THU数据结构编程作业一：列车调度（Train）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/49201087</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/49201087</guid><author>wangbingcsu</author><pubDate>Sat, 17 Oct 2015 09:35:08 +0800</pubDate><description><![CDATA[问题描述某列车调度站的铁道联接结构如图所示。其中，A为入口，B为出口，S为中转盲端。所有铁道均为单轨单向式：列车行驶的方向只能是从A到S，再从S到B；另外，不允许超车。因为车厢可在S中驻留，所以它们从B端驶出的次序，可能与从A端驶入的次序不同。不过S的容量有限，同时驻留的车厢不得超过m节。 
设某列车由编号依次为{1, 2, …, n}的n节车厢组成。调度员希望知道，按照以上交通规则，这些车厢能否以]]></description><category></category></item><item><title><![CDATA[THU数据结构编程作业一：祖玛（Zuma）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/48718539</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/48718539</guid><author>wangbingcsu</author><pubDate>Fri, 25 Sep 2015 08:50:24 +0800</pubDate><description><![CDATA[* 祖玛(Zuma) *描述 
祖玛是一款曾经风靡全球的游戏，其玩法是：在一条轨道上初始排列着若干个彩色珠子，其中任意三个相邻的珠子不会完全同色。此后，你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻，它们就会立即消失。这类消除现象可能会连锁式发生，其间你将暂时不能发射珠子。开发商最近准备为玩家写一个游戏过程的回放工具。他们已经在游戏内完成了过程记录的功能，而回放功能的实现]]></description><category></category></item><item><title><![CDATA[THU数据结构编程作业一：查询范围（Range）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/48717999</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/48717999</guid><author>wangbingcsu</author><pubDate>Thu, 24 Sep 2015 21:00:29 +0800</pubDate><description><![CDATA[查询范围（Range） 
描述 
数轴上有n个点，对于任一闭区间 [a, b]，试计算落在其内的点数。输入 
第一行包括两个整数：点的总数n，查询的次数m。第二行包含n个数，为各个点的坐标。以下m行，各包含两个整数：查询区间的左、右边界a和b。输出 
对每次查询，输出落在闭区间[a, b]内点的个数。样例Input5 2
1 3 7 9 11
4 6
7 12Output0
3限制 
0 ≤ n,]]></description><category></category></item><item><title><![CDATA[C/C++中const关键字详解]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/48344327</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/48344327</guid><author>wangbingcsu</author><pubDate>Thu, 10 Sep 2015 15:42:26 +0800</pubDate><description><![CDATA[为什么使用const？采用符号常量写出的代码更容易维护；指针常常是边读边移动，而不是边写边移动；许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)，分类如下：常变量：  const 类型说明符 变量名常引用：  const 类型说明符 &引用名常对象：  类名 const 对象名常成员函数：  类名::fun(形参) const常数组：  类型]]></description><category></category></item><item><title><![CDATA[C++编译器符号表有哪些内容？]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/48340479</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/48340479</guid><author>wangbingcsu</author><pubDate>Thu, 10 Sep 2015 11:06:35 +0800</pubDate><description><![CDATA[C++编译器符号表有哪些内容？很早就想写一篇关于符号表的学习小结，可是迟迟不能下笔。其一是因为符号表在编译器的设计中占有举足轻重的地位【我们在学习编译原理的时候更多的是注重principles，而没有关心一个编译器的实现，所以符号表讲解的也比较少】，编译阶段的每“遍”都会和符号表打交道，本人只做过一个Mini C的编译器的前端部分，感觉功底不够；其二是因为我想在原来C语言的基础上，增加C++语言符号]]></description><category></category></item><item><title><![CDATA[关于C/C++内存分配问题]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/48311375</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/48311375</guid><author>wangbingcsu</author><pubDate>Wed, 09 Sep 2015 09:47:53 +0800</pubDate><description><![CDATA[一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区（stack）— 程序运行时由编译器自动分配，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。2、堆区（heap） — 在内存开辟另一块存储区域。一般由程序员分配释放，若程序员不释放，程序结束时可能由OS回收。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。3、全局区（静态区）（s]]></description><category></category></item><item><title><![CDATA[C/C++ 程序进程在内存中的分布]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/48267259</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/48267259</guid><author>wangbingcsu</author><pubDate>Mon, 07 Sep 2015 16:17:53 +0800</pubDate><description><![CDATA[c/c++程序进程在内存中的表示包括：
文本段
初始化数据段
未初始化数据段
堆
栈文本段， 也称作代码段。 主要包含可执行代码，这部分是只读的。
初始化数据段，也通常简称为数据段。它包含全局变量和由程序员初始化的静态变量。 
这部分还可以细分为只读部分和可读可写的部分，例如定义在主函数之外的变量（全局）
char s[] = "hello";
static int i = 1;这两个变量存储在已初]]></description><category></category></item><item><title><![CDATA[堆和栈的区别（转过无数次的文章）]]></title><link>https://blog.youkuaiyun.com/wangbingcsu/article/details/48260777</link><guid>https://blog.youkuaiyun.com/wangbingcsu/article/details/48260777</guid><author>wangbingcsu</author><pubDate>Mon, 07 Sep 2015 08:31:39 +0800</pubDate><description><![CDATA[一、预备知识—程序的内存分配 
  一个由C/C++编译的程序占用的内存分为以下几个部分 
  1、栈区（stack）—   由编译器自动分配释放   ，存放函数的参数值，局部变量的值等。其 
  操作方式类似于数据结构中的栈。 
  2、堆区（heap）   —   一般由程序员分配释放，   若程序员不释放，程序结束时可能由OS回 
  收   。注意它与数据结构中的堆是两回事，分配方式倒是类似]]></description><category></category></item></channel></rss>