自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Mars.的专栏

Courage is going from failure to failure without losing enthusiasm.

  • 博客(33)
  • 资源 (1)
  • 收藏
  • 关注

原创 重构二叉树(Java实现)

之前写过二叉树重构的C++实现,下面的是Java实现基本原理还是递归。package com.mars.binaryree;import java.util.Arrays;/** * 二叉树重构 * @author Mars * */public class Solution { public static void main(String[] args) { int[

2016-05-11 11:02:13 2946 1

原创 无序数组中找到第K小的数(或者找到最小的K个数)

题目:在一个很大的无序数组中用最快的速度找到第K小的数(或者找到最小的前K个数)。(类似于,在一个有1000000个数的数组中找到最小的100个数)对于这个问题首先想到的可能是把这个数组进行按从小到大排序,排序完以后就可以直接确定第K小的数字了。但是,这样够快吗?假设我们是先对数组进行排序,那么肯定会选择最快的排序算法,对于庞大的数组首选当然是快速排序,而且是随机快速排序。现在考虑整个快速排序的过程

2016-04-25 12:15:47 8434

原创 找出局部有序数组的最大值

题目:将一个有序数组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

2016-04-24 21:50:03 4225

原创 二叉搜索树中找出比K大的最小的那个数

这是一道面试的算法题,题目不难,但是在面试的时候是要求直接在白板上写程序,感觉自己还是弱爆了。第一次体验这种面试方式,虽然被虐,但是感觉还是挺好的,这方面的经验还是需要积累。题目: 在一个二叉搜索树种查找比某个数(K)大数中最小的那个。先把二叉树相关的构造代码贴上,下面是二叉树的节点定义。/***节点*/public class Node { private int data;

2016-04-24 21:00:22 4373

原创 Java并发编程实战学习笔记(三)-线程封闭

当访问共享数据时,通常需要使用同步。一种可以避免使用同步的方式就是不共享数据,如果仅在单线程内访问数据就不需要同步。这种技术被称为线程封闭。1. Ad-hoc线程封闭 Ad-hoc线程封闭指的是,维护线程封闭性的职责完全由程序来承担。Ad-hoc线程封闭是非常脆弱的,因为没有任何一种语言特性,例如可见性修饰符或局部变量,能将对象封闭到目标线程上。事实上,对线程封闭对象(例如,GUI应用程序

2016-01-18 13:22:20 2389

原创 Java并发编程实战学习笔记(一)-线程安全性

编写线程安全的代码的核心是要对状态访问操作进行管理,尤其是对共享的和可变的状态访问。 这里的对象的状态可以看成是存储在状态变量(例如实例或静态域)中的数据。1.什么是线程安全线程安全性定义中最核心的是概念是正确性。 正确性的含义是:某个类的行为和规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象,以及定义各种后验条件来描述对象操作的结果。 在正确性定义的基础上,线程安全性的定义:当

2016-01-15 19:22:41 2143

原创 浙大PAT(PAT Basic Level) 1045—— 快速排序

今天在浙大PAT里面看到了这一题,通过过滤挺低的,就像挑战下,毕竟只是Basic Level 嘛! 看到题目以为是用快速排序解决问题,后来只被题目忽悠了。废话不多说,直接上题目:题目 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列,请问有多少个元素可能是

2015-10-31 11:17:34 2420

原创 THU数据结构编程作业一:真二叉树重构(Proper Rebuild)

本题是对二叉树进行重构,与普通的二叉树重构不同的是本题是针对特殊的二叉树——真二叉树进行重构。 对于普通的二叉树我们知道可以通过 中序遍历+ 前序遍历/后序遍历 完成重构,并且如果仅已知前序遍历和后续遍历无法对一颗普通二叉树进行重构(可以简单理解为当某节点只有一个孩子节点的时候无法判断该孩子节点是左孩子还是右孩子),之前的博客已经进行了整理。但是如果对于一颗真二叉树在仅知道前序遍历和后序遍历的情况

2015-10-29 20:07:56 7151 7

原创 数据结构与算法学习笔记——二叉树重构(递归)

关于二叉树的另外一个重要内容就二叉树的重构,二叉树的重构就是根据已知的二叉树前序,中序,后续遍历的数组重新构造出园二叉树。 对于普通的二叉树可以由 前序遍历+中序遍历 或者 后序遍历+中序遍历 重构(注意:二叉树各节点不能有相同值)。 对于只知道 前序遍历和后续遍历是否可以进行二叉树重构呢?对于普通二叉树以上两个条件是无法重构二叉树的,比如: 1 1

2015-10-26 22:38:11 4385

原创 数据结构与算法学习笔记——二叉树遍历(二)(Morris Traversal)

前面介绍了一般的二叉树遍历方法,包括递归和迭代。这两种方法的空间复杂度都是O(n)。 二叉树遍历的另外一种方法:Morris遍历二叉树 的空间复杂度为O(1),并且还不改变原本的树结构,时间复杂度依然为O(n)。Morris的核心是利用叶子节点的空闲右孩子指针返回到根节点。中序遍历最初Morris是为中序遍历二叉树提出的方法,在中序的基础上可实现先序和后续遍历,这里先整理中序遍历。 中序遍历的顺

2015-10-26 17:15:00 1361

原创 数据结构与算法学习笔记——二叉树遍历(一)(递归、迭代)

最近学习二叉树相关的内容,个人认为其中最重要的应该就是二叉树的遍历了,包括先序,中序,后续。通常二叉树的遍历有三种方法:递归、迭代和Morris遍历。递归应该是最容易理解了, Morris遍历最难理解。关于Morris遍历后面会单独再整理。节点的定义struct Node{ int data; Node *parent, *left, *right; Node(in

2015-10-26 15:52:19 1004

原创 THU数据结构编程作业一:隧道(Tunel)

本题主要解决的问题: 常数时间复杂度范围内获得栈的最大值; 用两个栈模拟一个队列。 细节问题:scanf 和 getchar 获取输入的问题。 问题描述 现有一条单向单车道隧道,每一辆车从隧道的一端驶入,另一端驶出,不允许超车。该隧道对车辆的高度有一定限制,在任意时刻,管理员希望知道此时隧道中最高车辆的高度是多少。 现在请你维护这条隧道的车辆进出记录,并支持查询最高车辆的功能输入 第一

2015-10-18 11:37:01 1388

原创 THU数据结构编程作业一:列车调度(Train)

问题描述某列车调度站的铁道联接结构如图所示。其中,A为入口,B为出口,S为中转盲端。所有铁道均为单轨单向式:列车行驶的方向只能是从A到S,再从S到B;另外,不允许超车。因为车厢可在S中驻留,所以它们从B端驶出的次序,可能与从A端驶入的次序不同。不过S的容量有限,同时驻留的车厢不得超过m节。 设某列车由编号依次为{1, 2, …, n}的n节车厢组成。调度员希望知道,按照以上交通规则,这些车厢能否以

2015-10-17 09:35:08 5580 3

原创 THU数据结构编程作业一:祖玛(Zuma)

* 祖玛(Zuma) *描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。开发商最近准备为玩家写一个游戏过程的回放工具。他们已经在游戏内完成了过程记录的功能,而回放功能的实现

2015-09-25 08:50:24 9668 4

原创 THU数据结构编程作业一:查询范围(Range)

查询范围(Range) 描述 数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数。输入 第一行包括两个整数:点的总数n,查询的次数m。第二行包含n个数,为各个点的坐标。以下m行,各包含两个整数:查询区间的左、右边界a和b。输出 对每次查询,输出落在闭区间[a, b]内点的个数。样例Input5 21 3 7 9 114 67 12Output03限制 0 ≤ n,

2015-09-24 21:00:29 3010 2

转载 C/C++中const关键字详解

为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下:常变量: const 类型说明符 变量名常引用: const 类型说明符 &引用名常对象: 类名 const 对象名常成员函数: 类名::fun(形参) const常数组: 类型

2015-09-10 15:42:26 406

转载 C++编译器符号表有哪些内容?

C++编译器符号表有哪些内容?很早就想写一篇关于符号表的学习小结,可是迟迟不能下笔。其一是因为符号表在编译器的设计中占有举足轻重的地位【我们在学习编译原理的时候更多的是注重principles,而没有关心一个编译器的实现,所以符号表讲解的也比较少】,编译阶段的每“遍”都会和符号表打交道,本人只做过一个Mini C的编译器的前端部分,感觉功底不够;其二是因为我想在原来C语言的基础上,增加C++语言符号

2015-09-10 11:06:35 11740

转载 关于C/C++内存分配问题

一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(s

2015-09-09 09:47:53 597

翻译 C/C++ 程序进程在内存中的分布

c/c++程序进程在内存中的表示包括:文本段初始化数据段未初始化数据段堆栈文本段, 也称作代码段。 主要包含可执行代码,这部分是只读的。初始化数据段,也通常简称为数据段。它包含全局变量和由程序员初始化的静态变量。 这部分还可以细分为只读部分和可读可写的部分,例如定义在主函数之外的变量(全局)char s[] = "hello";static int i = 1;这两个变量存储在已初

2015-09-07 16:17:53 1258

转载 堆和栈的区别(转过无数次的文章)

一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似

2015-09-07 08:31:39 354

转载 C++ primer 【笔记】C++中this指针的用法详解

本文转自: C++的一大误区——深入解释直接初始化与复制初始化的区别 不久前,在博客上发表了一篇文章——提高程序运行效率的10个简单方法,对于其中最后一点,多使用直接初始化,有很多读者向我提出了疑问,并写了一些测试程序,来说明直接初始化与复制初始化是同一件事。让我了解到大家对于直接初始化与复制初始化的区别的确是不太清楚,无可否认,那篇文章的例子用得的确不太好,在这里表示歉意!所以我觉得还是有必要跟大

2015-08-26 18:15:10 1966

转载 C++静态成员函数小结

类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同

2015-08-21 16:46:28 339

原创 C++Primer 【笔记】文本查询程序 TextQuery

《c++ primer》容器这一部分有一个综合应用的小程序设计。要求:程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示,即第 7 行应该在第 9 行之前输出,依此类推。 设计程序的一个良好习惯是首先将程序所涉及的操作列出来。明确需要提供的操作有助于建立需要的数据

2015-08-14 16:03:15 916

原创 c++ primer 【笔记】multimap 和 multiset类型

map 和 set 容器中,一个键只能对应一个实例。而 multiset 和 multimap类型则允许一个键对应多个实例。multimap 和 multiset 所支持的操作分别与 map 和 set 的操作相同,只有一个例外:multimap 不支持下标运算。不能对 multimap 对象使用下标操作,因为在这类容器中,某个键可能对应多个值。为了顺应一个键可以对应多个值这一性质,map 和 mu

2015-08-14 11:10:02 650

原创 C++ primer 【笔记】关联容器 set

使用 set 容器必须包含 set 头文件。 map 容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set 容器只是单纯的键的集合。当只想知道一个值是 否存在时,使用 set 容器是最适合的。 set 容器支持大部分map 操作 ,包括:insert、cout、find、erase。但是 set 不支持下标操作,而且没有定义 mapped_type 类型。在 set 容器中,v

2015-08-13 17:25:18 455

原创 C++ primer【笔记】关联容器 map

1.pair对象pair对象类型在 utility 头文件中定义。表1.1 pair 类型提供的操作 pair< T1, T2 > p1; 创建一个空的 pair 对象,它的两个元素分别是 T1 和 T2类型,采用值初始化 pair< T1, T2 > p1(v1,v2); 创建一个 pair 对象,它的两个元素分别是 T1 和 T2 ,其中 first 成员初始化为 v1

2015-08-13 08:42:00 533

原创 C++primer【笔记】 顺序容器

这一章主要学习了C++的三种顺序容器:vector、list 、deque(双端队列),三种适配器:stack(堆栈)、queue(队列)、priority_queue(有优先级管理的队列)。1. 顺序容器1.1初始化表1.1 容器构造函数 构造函数形式 备注 C< T > c; C为类型名,c为空容器,T是元素类型 C c(c2); 创建 c 并用 c2 初始化, c 和

2015-08-11 17:13:43 500

原创 C++学习笔记之erase

今天编写《C++primer》的习题9.26的小程序,主要是对erase的使用。先贴上代码。#include <iostream>#include <vector>#include <list>using namespace std;int main(){ int a[] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };

2015-08-10 19:47:24 521

转载 【转】C++ 文件结束符

转载自: http://blog.163.com/zhuandi_h/blog/static/1802702882012210114352789/“>c++文件结束符问题描述:windows下int main(){string str;while(cin>>str);cout<<"\n"<<"end"<<endl;}控制台输入多个字符串后,输入文件结束符crtl-Z,并未使while循环结束,该如

2015-06-12 09:05:12 546

原创 数据结构与算法学习笔记——动态规划(1)

动态规划问题一:装配线调度问题装配线调度问题是动态规划的经典问题:一个汽车底盘在进入每一条装配线后,在装配站中会在底盘安装部件,然后完成装配的汽车在装配线末端离开。每条装配线有n个装配站,编号为j=1,2,...,n.j=1,2,...,n.。将装配线ii(ii为1或2)的第jj 个装配站表示为Si,jS_{i,j} 。将装配线1的 j 个站(S1,jS_{1,j})和装配线2的 j 个站(S2,j

2015-04-25 18:55:51 522

原创 三个数中取出最大的两个

深深感觉自己智商不够用 其实上一篇笔记并没有写完,还有求一个数组中最大的两个数的问题,但是在自己编写这个问题的程序的时候,突然脑残的卡在了三个数的大小比较上!瞬间怒了!!!决定要把三个数的比较问题和算法好好研究下!治治自己的脑残!!! ~~~~~~~~~~~~~~~~问题描述:在三个数(a,b,c)中取出最大的两个数 x1,x2分别存放最大的数和第二大的数,不适用指针,且暂且不考虑有相同的值1.

2015-04-09 16:51:32 1333

原创 数据结构学习笔记(绪论二)

递归迭代的应用比较数组求和问题计算任意n个整数之和。 使用不同的算法求和,比较优劣。典型算法int Sum_Array_Claassical(int A,int n){ int sum=0; for(int i=0;i<n;i++) sum+=A[i]; return sum;}该算法复杂度:T(n)=O(n)T(n)=O(n)线性递归递归:减而治之,将大

2015-04-08 16:40:40 424

原创 数据结构学习笔记(绪论一)

绪论Programs= Algorithms+Data Structus算法分析一个好的算法:运算速度尽可能快,存储空间尽可能少。 算法分析: a. 正确性; b. 成本(时间+空间) 时间成本—>基本操作次数Turning Machine(图灵机模型) Random Access Machine(RA

2015-04-08 10:26:55 847

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除