自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 问答 (2)
  • 收藏
  • 关注

转载 堆排序

堆排序       堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆  堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:  Key[i]=Key[2i+1]&&key>=key[2i+2]  即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。  堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>

2015-08-27 14:44:56 335

转载 c++ volatile

1. 为什么用volatile?    C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明:A volatile specifier is a hint to a compiler that

2015-08-24 20:20:22 479

原创 Effective c++读书笔记

条款5:   如果你打算在一个"内含引用成员"的class内支持赋值操作,你必须自己定义拷贝赋值运算符.   只有生出的代码合法且有适当机会证明它有意义.其中一个条件不符合,编译器会拒绝为class生出opetator=(如数据成员为引用类型或者const类型).

2015-08-21 11:49:30 377

原创 复杂链表的复制

题目:   实现函数ComplexListNode* Clone(ComplexListNode* pHead), 复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL.结点定义如下:struct ComplexListNode{ int m

2015-08-25 21:13:41 557

原创 二叉树中和为某一值的路径

题目:   输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.#include <vector>#include <stdio.h>using std::vector;void FindPath(BinaryTreeNode* pRoot, int expectedSum, vector<int>& pa

2015-08-24 22:23:50 640

原创 二叉搜索树的后序遍历序列

题目: 输入一个整形数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false. 假设输入的数组的任意两个数字都互不相同.例如输入数组{5,7,6,9,11,10,8},则返回true. {7,4,6,5}则返回false.思路:  后序遍历最后一个结点是根结点. 从第一个结点开始,找第一个大于根结点的结

2015-08-22 21:49:27 549

原创 从上往下打印二叉树

题目: 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.思路: 借助一个队列,先输出头节点,并把他的左右结点进队列,取队头,这个结点就是跟节点的左结点,输出并且把它的左右节点进队列. 因为队列是先进先出,所以到最后输出的就是按层次遍历的结果.void PrintFromTopToBottom(BinaryTreeNode* pTreeR

2015-08-22 16:22:08 721

原创 栈的压入,弹出序列

题目:  输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等, 例如序列 1,2,3,4,5 是某栈的弹出顺序. 序列4,5,3,2,1 是该栈序列对应的一个弹出序列, 但4,3,5,1,2就不可能是该栈序列的弹出序列.思路: 建立一个辅助栈,把输入的第一个序列中的数字一次进栈, 并按照第二个序列的顺

2015-08-22 15:30:48 700

原创 汇总

1.LinkList从尾到头打印链表 链表中倒数第k个结点 Remove Nth Node From End of List 反转链表 合并两个排序的链表 Merge Two Sort Lists 在O(1)时间内删除链表结点 Add Two Sum2.Array 二维数组的查找 旋转数组最小数字 Remove Duplicates from Sorted Array Remo

2015-08-21 21:15:06 537

转载 C++ Assert

MSDN原文如是说:Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program.(判断一个表达式,如果结果为假,输出诊断消息并中止程序。)[cpp] view plaincopyprint?

2015-08-20 15:49:59 446

原创 包含min函数的栈

题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1).思路   使用两个栈,一个数据栈用来存放数据,一个辅助栈用来存放最小值.#include <stack>#include <assert.h>template <typename T> class StackWithMin{publi

2015-08-20 15:41:24 730

原创 树的子结构

题目 输入两颗二叉树A和B,判断B是不是A的子结构.二叉树结点的定义如下:先在A中找B的跟节点,若找到相同的,在判断左右子树是否相同.struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; BinaryTreeNode(i

2015-08-18 23:18:36 516

原创 二叉树的镜像

题目   请完成一个函数,输入一个二叉树,该函数输出它的镜像.//把每个非叶子结点的左右字数交换struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; BinaryTreeNode(int n) : m_nValue(n), m_pLe

2015-08-18 21:47:51 541

转载 TCP堵塞控制

在TCP协议中,我们使用连接记录TCP两端的状态,使用编号和分段实现了TCP传输的有序,使用advertised window来实现了发送方和接收方处理能力的匹配,并使用重复发送来实现TCP传输的可靠性。我们只需要将TCP片段包装成IP包,扔到网络中就可以了。TCP协议的相关模块会帮我们处理各种可能出现的问题(比如排序,比如TCP片段丢失等等)。最初的TCP协议就是由上述的几大块构成的。

2015-08-18 18:30:43 563

原创 合并两个排序的链表

题目 输入两个递增排序的链表, 合并这两个链表并使新链表中的结点仍然是按照递增排序的.ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ if (pHead1 == NULL) return pHead2; else if (pHead2 == NULL) return pHe

2015-08-16 18:13:14 642

转载 TCP重发机制

TCP协议是一个可靠的协议。它通过重新发送(retransmission)来实现TCP片段传输的可靠性。简单的说,TCP会不断重复发送TCP片段,直到片段被正确接收。TCP片段丢失 TCP头部的checksum接收方(receiver)可以通过校验TCP片段头部中checksum区域来检验TCP片段是否出错。我们已经接触过了IP协议详解的checksum算法

2015-08-15 23:33:46 19309 1

原创 反转链表

题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点.ListNode* ReverseList(ListNode* pHead){ if (pHead == NULL) return NULL; ListNode* pPrev = NULL; ListNode* pNode = pHead; while (

2015-08-15 16:52:51 534

原创 链表中倒数第k个结点

题目  输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个结点.双指针实现一次遍历就能找到,要注意代码的鲁棒性.code:ListNode* FindKthToTail(ListNode* pListHead, unsigned int k){ if (pListHead == NULL || k == 0) {

2015-08-15 12:00:27 554

转载 TCP连接

在TCP协议与”流”通信中,我们概念性的讲解了TCP通信的方式。可以看到,TCP通信最重要的特征是:有序(ordering)和可靠(reliable)。有序是通过将文本流分段并编号实现的。可靠是通过ACK回复和重复发送(retransmission)实现的。这一篇文章将引入TCP连接(connection)的概念。TCP连接网络层在逻辑上提供了端口的概念。一个IP地址可以有多个端口

2015-08-13 20:34:42 537

原创 leetcode Remove Element

Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn’t matter what you leave beyond the new length.class Solu

2015-08-13 15:53:06 590

转载 TCP协议

TCP(Transportation Control Protocol)协议与IP协议是一同产生的。事实上,两者最初是一个协议,后来才被分拆成网络层的IP和传输层的TCP。我们已经在UDP协议中介绍过,UDP协议是IP协议在传输层的“傀儡”,用来实现数据包形式的通信。而TCP协议则实现了“流”形式的通信。TCP的内容非常丰富。我不能在一篇文章中将TCP讲完。这一篇主要介绍TCP协议的下面几

2015-08-13 00:12:25 412

转载 UDP协议

我们已经讲解了物理层、连接层和网络层。最开始的连接层协议种类繁多(Ethernet、Wifi、ARP等等)。到了网络层,我们只剩下一个IP协议(IPv4和IPv6是替代关系)。进入到传输层(transport layer),协议的种类又开始繁多起来(比如TCP、UDP、SCTP等)。这就好像下面的大树,根部(连接层)分叉很多,然后统一到一个树干(网络层),到了树冠(传输层)部分又开始开始分叉,

2015-08-13 00:00:53 407

转载 互联网协议入门(2)

上一篇文章分析了互联网的总体构思,从下至上,每一层协议的设计思想。这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的。==============================================================互联网协议入门(二)作者:阮一峰(接上文)七、一个小结

2015-08-12 22:02:47 372

转载 互联网协议入门(1)

我们每天使用互联网,你是否想过,它是如何实现的?全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗?互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite)。它们对电脑如何连接和组网,做出了详尽的规定。理解了这些协议,就理解了互联网

2015-08-12 21:42:17 374

原创 在O(1)时间删除链表结点

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数定义如下:  struct ListNode{ int m_nValue; ListNode* m_pNext;};code://把待删结点后面一个结点的值赋给待删结点,然后把待删结点next指针指向下下个结点,然后删除下个结点, 达到和删除待删结点一样的效果.void DeleteNod

2015-08-12 18:34:06 791

转载 c++防止迭代器失效

vec.begin()是容器的第0个元素,vec.end()是容器最后一个元素的下一个元素。添加元素(insert, push)也可能使迭代器失效,容器可能会重新分配内存。删除元素也会使指向被删元素的迭代器失效;对于vec.erase(iter),容器vec中删除迭代器iter所指的元素,并返回iter的下一个元素。不要存储和使用vec.end()所返回的迭代器,因为插入和删除操作都会使其失效

2015-08-11 10:42:55 948

转载 c++迭代器失效2

众所周知当使用一个容器的insert或者erase函数通过迭代器插入或删除元素”可能”会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作:view plaincopy to clipboardprint? iter=vec.insert(iter); iter=vec.erase(iter); 想想究竟为什么迭

2015-08-11 09:46:31 372

转载 c++迭代器失效

首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效。那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储这个元素。于是vector必须重新分配存储空间,用来存放原来的

2015-08-11 09:24:49 472

原创 leetcode Remove Duplicates from Sorted Array

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.Do not allocate extra space for another array, you must do this in place with cons

2015-08-10 18:35:54 604

原创 冒泡排序

冒泡排序 设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交 换。 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就 “沉”到数组第N-1个位置。 3.N=N-1,如果N不为0就重复前面二步,否则排序完成void bubbleSort1(int arr[], int length){ for (int i = 0;

2015-08-07 11:29:32 411

原创 快速排序

48  57  28  39  63  31  90  64  6  87i                                                      jx=48, i=0, j=length-1; 把他看成(48放入了x中):    57  28  39  63  31  90  64  6  87i

2015-08-05 23:02:13 451

原创 leetcode Merge Two Sorted Lists

class Solution{ public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == NULL) { return l2; } if (l2 == NULL)

2015-08-05 20:03:26 439

原创 面试题——二进制中1的个数

题目: 实现一个函数,输入一个整数,输出该数的二进制表示中1的个数。 例如把9表示成二进制是1001, 有两位是1。 因此如果输入9,该函数输出2。考察的是位运算, 位运算一些基本操作: 与(&), 或(|),异或(^), 左移<<, 右移>> code:#include <stdio.h>int NumberOf1_Solution1(int n){ int count

2015-08-05 15:21:12 527

转载 c++中异常类的使用方法

C++有很多的标准异常类:namespace std{    //exception派生    class logic_error; //逻辑错误,在程序运行前可以检测出来     //logic_error派生    class domain_error; //违反了前置条件    class invalid_argument; //指出函数的一个无效参数  

2015-08-04 16:05:02 408

原创 旋转数组最小数字

题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素。 例如数组{3,4,5,1,2} 为{1,2,3,4,5}的一个旋转, 该数组的最小值为1。code:int Min(int* numbers, int length){ if (numbers == NULL || length < 0) {

2015-08-04 15:59:12 443

转载 c++11移动语义右值引用

http://www.cnblogs.com/hujian/archive/2012/02/13/2348621.html

2015-08-04 00:09:03 574

原创 c++ 11 基于范围的for循环

基于范围的for循环: 对于内置数组以及包含方法begin()和end()的类(如std::string)和STL容器,基于范围的for循环可以简化为他们编写循环的工作。这种循环对数组或容器中的每个元素执行指定的操作:#include <iostream>int main(){ double prices[5] = {4.99,10.99,6.87,7.99,8.49}

2015-08-02 20:27:23 3183 1

原创 两个栈实现队列及两个队列实现栈

用两个栈实现队列的push() 和 pop()#include <iostream>#include <stack>#include <stdexcept>using namespace std;template <class T>class CQueue{ public: CQueue() {}; ~CQueue() {}; void appen

2015-08-02 18:43:11 581

原创 重建二叉树

题目  输入某二叉树的前序遍历和中序遍历,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。  例如,前序遍历序列:{1,2,3,7,3,5,6,8},中序遍历序列:{4,7,2,1,5,3,8,6}BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, in

2015-08-02 16:30:18 519

转载 c++成员函数指针的应用

C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。   刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的。本文引导你了解成员函数指针的声明,赋值和调用回叫函数。   成员函数指针的声明

2015-08-02 10:40:59 400

空空如也

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

TA关注的人

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