- 博客(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
空空如也
selenium运行报错,需要的jar包都导入了
2018-03-16
如何抓取网站加密压缩后的数据?
2018-02-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人