- 博客(107)
- 收藏
- 关注
原创 TCP和UDP区别、联系
TCPTCP和UDP的区别:1.TCP面向连接(如打电话前要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。2.TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠性。TCP要求系统资源较多,UDP较少,程序结构较简单。3.TCP面向字节流,实际上是TCP把数据看成一连串无结构的字
2017-09-22 18:11:52 616
转载 关于c++ new操作符的重载
原文地址:http://blog.csdn.net/bichenggui/article/details/4823978关于c++ new操作符的重载你知道c++ 的new操作符和operator new的区别么?也许你还会问,他们有区别吗? 当你写下面这样的代码时,string *pa = new string("memory managerment");你使用的是n
2017-09-22 08:00:54 1057
原创 剑指offer 3---二维数组的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都是按照从上到下递增的顺序排序。请完成函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。代码实现: bool Find(int target, vector > array) { if(array.size()==0){ return 0
2017-08-19 18:31:12 712 1
原创 剑指offer 38---数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数,例如输入排序数组{1,2,3,3,3,3,4,5};和数字3,由于3在数组中出现了4次,因此输出4.思路:时间复杂度: O(logn)空间复杂度: O(1)int FindFirstK(int* arr,
2017-08-08 14:40:03 604
原创 剑指offer 40---数组中只出现一次的字符
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写出程序找出这两个只出现了一次的数字,要求时间复杂度为O(n),空间复杂度为O(1)。
2017-08-08 10:57:23 711
原创 剑指offer 34---丑数
题目:求按从小到大的第1500个丑数。丑数:只包含因子2,3,5的数称为丑数。所谓一个数m是另一个数n的因子,是指n能被m整除。例: 解1:直观解法,从1开始计算,然后计数,直到第1500个丑数缺陷:每个整数都需要计算,效率非常低//判断是不是丑数bool IsUflyNum(int num){ if (num <= 0) { retu
2017-08-04 00:03:07 560 1
原创 求一个无序数组的中位数
求一个无序数组的中位数中位数是将数组排序之后,数组个数为奇数时,取中间的即为中位数;数组个数为偶数时,取中间两个的平均值即为中位数。思路一:要取得中位数,即给数组排序,使用任意排序算法均可,然后按数组下标取其中位数。PS:该方法很直观,此处不实现思路二:1.设数组元素为n个,且为奇数个时,取数组前(n+1)/2个元素建一个小堆2.遍历数组剩余元素,如果比堆顶
2017-08-03 17:33:07 9679 3
原创 归并排序
归并排序:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。步骤:1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列2.时间复杂度: O(N*lgN)空间复杂度: O(N) 需要额外空间性能: 稳定归并排序主要分
2017-08-03 12:50:15 453
原创 剑指offer 14---调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
2017-08-02 17:27:25 425
原创 剑指offer 9---斐波那契数列
题目:写一个函数,输入n,求斐波那契数列的第n项。解1:递归实现斐波那契数列#include #include using namespace std;int Fibonacci(int n) //递归实现斐波那契数列{ if (n <= 0) { return 0; } if (n == 1) { return 1; }
2017-08-01 23:38:43 748 5
原创 C语言模式实现C++继承和多态
C语言模式实现C++继承和多态描述:C实现一个struct A和struct B各包含一个int成员a和b,要求达到B继承了A的效果,也就是B里面包含一个A。并且能达到多态的效果,也就是一个A*p指向A调的是A的函数,指向B调用的是B的函数。C++中的继承、多态继承是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质
2017-08-01 22:06:13 1094
原创 大、小端机器判断
大、小端判断大端模式:所谓的大端模式,是指数据的高字节保存在内存的低地址处,而数据的低字节保存在内存的高地址处。例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 00000000440: b484 6c4e 004e ed00 0000 0000 0100 0000在大端模式下,前32位应该这样读: e6 84 6
2017-07-27 21:32:28 757
转载 const volatile int i=10; i是什么属性?
const和volatile放在一起的意义在于:1.本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心;2.另一个程序段则完全有可能修改,因此编译器最好不要做太激进的优化。“const”含义是“请做为常量使用”,而并非“放心吧,那肯定是个常量”。“volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这
2017-07-27 15:43:02 2491
原创 判断一个值是否在一棵二叉树中。(注意多测几个值,看是否都能找到)
判断一个节点是否在一棵二叉树中。(注意多测几个节点,看是否都能找到)思路:分别和二叉树中的每个结点值相比,找到返回true,找不到返回false//判断一个节点是否在一棵二叉树中。(注意多测几个节点,看是否都能找到) bool _IsExit(Node* root,T key) { if (root == NULL) { return false; } if
2017-07-27 11:20:37 1348
原创 销毁一颗二叉树-->Destroy(Node* root)
销毁一颗二叉树-->Destroy(Node* root)二叉树的很多问题都可用递归实现//销毁一颗二叉树-->Destroy(Node* root) void _Destory(Node* root) { if (root != NULL) { _Destory(root->_left); _Destory(root->_right); delete ro
2017-07-23 22:04:33 4756
原创 剑指offer 39---求二叉树的深度 && 输入一颗二叉树的根节点,判断该树是不是平衡二叉树
求二叉树的深度递归求解/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: int TreeDe
2017-07-23 21:46:16 781
原创 求二叉树叶子节点的个数 && 求第K层的节点个数
求二叉树叶子节点的个数思路:1.如果根节点为NULL时,则是空树,返回0;2.根节点不为空时,如果根节点的左右子树均为空,则该二叉树中只有一个节点,即返回1;3.叶子节点的个数=左子树叶子节点数+右子树叶子节点数;int _GetNodeyezi(Node* root) //叶子节点的个数 { if (root == NULL) { return 0;
2017-07-23 20:11:02 1394
原创 剑指offer 18---输入两棵二叉树A和B,判断B是不是A的子结构
输入两棵二叉树A和B,判断B是不是A的子结构思路:1.先在A中找和B的根节点相同的结点2.找到之后遍历对应位置的其他结点,直到B中结点遍历完,都相同时,则B是A的子树3.对应位置的结点不相同时,退出继续在A中寻找和B的根节点相同的结点,重复步骤,直到有任何一棵二叉树为空退出/*struct TreeNode { int val; struct Tr
2017-07-23 17:36:34 1816
原创 剑指offer 37---求两个链表的第一个公共结点
求两个链表的第一个公共结点思路:此处求解的是两个单链表,如果两个单向链表有公共的结点,那么这两个链表从某一结点开始,它们的_next都指向同一结点。由于是单链表的结点,每个结点只有一个_next,因此从第一个公共结点开始,之后它们所有的结点都是重合的,不可能再出现分叉。所以两个有公共结点而部分重合的链表,拓扑形状像一个Y,而不可能是Xstruct ListNode{
2017-07-22 21:45:39 672
原创 剑指offer 23----二叉树的前序、中序、后序、层序遍历
二叉树的前序、中序、后序、层序遍历#include #include #include using namespace std;templatestruct BinaryTreeNode //构建二叉树的节点,及左右子树的指针{ T _data; //值 BinaryTreeNode* _left; //左子树 BinaryTreeNode* _right
2017-07-21 14:20:21 621 4
原创 剑指offer 10----计算一个整数二进制位中1的个数
计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。int BitCount(int n){ int count = 0; while (n) { n = n&(n - 1); ++count; } return count;}int main(){ int n = 9; int tty = BitCount(n); c
2017-07-20 11:44:40 515
原创 二分查找
二分查找:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后
2017-07-20 10:24:42 374
原创 剑指offer 35---查找第一个只出现一次的字符
查找第一个只出现一次的字符//第一个只出现一次的字符 "abcdefghigkacdefg"char FirstRepete(char* str){ if (str == NULL) { return '\0'; } //利用哈希表解决 const int tablesize = 256; //一个字符占一个字节,所以有256种情况 unsigned int Ha
2017-07-19 18:22:18 714 4
原创 剑指offer 5---从尾到头打印单链表
从尾到头打印单链表PS:如果题设不要求不能改变链表结构时,可以使用单链表的逆置(之前已经写过),单链表的逆置改变了链表的方向,严格要求时不能这样写。解1:
2017-07-18 15:04:26 517 1
原创 删除一个无头单链表的非尾节点
删除一个无头单链表的非尾节点//删除一个无头单链表的非尾结点void DeleteNoHeadNode(ListNode* pos) //pos为要删除的结点{ assert(pos); if (pos->_next == NULL) { //pos为最后一个结点 delete pos; pos = NULL; } else { ListNode* posN
2017-07-18 10:52:14 662
原创 如何定义一个只能在堆(栈)上创建对象的类
如何定义一个只能在堆(栈)上创建对象的类1.只能在栈上创建对象的类只有使用new运算符,对象才会建立在堆上,因此,只要禁用new运算符就可以实现类对象只能建立在栈上class AA{public: AA() { cout << "AA()" << endl; } ~AA() { cout << "~AA()" << endl; }};int main()
2017-07-17 15:55:07 3164 1
转载 C++中友元详解
问题的提出 我们已知道类具备封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的。非成员函数能够访问类中的公有成员,但是假如将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程式的运行效率。 为了解决上述问题,提出一种
2017-07-17 13:57:52 219
转载 C++用new和不用new创建类对象区别
起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计中,有时候不使用new的确会带来很多问题。当然这都是跟new的用法有关的。new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高
2017-07-17 13:47:50 506
原创 剑指offer 48---设计一个类不能被继承
设计一个类不能被继承在C++继承中,子类的构造函数会自动调用父类的构造,子类的析构会自动调用父类的析构。一个简单的例子:class AA{public: AA() { cout << "AA()" << endl; } ~AA() { cout << "~AA()" << endl; }};class BB:public AA{public: BB(
2017-07-17 13:27:51 621
原创 腾讯笔试题--到底输出几个 -
请问下面的程序一共输出多少个“-”?为什么?结果:输出为: 6PS:有缓冲区\n 和 刷新缓冲区结果一样 结果:解析:1.程序一开使,bash产生一个进程P1执行此程序,2.P1进入程序后,当i=0时,fork()产生一个子进程P2,同时它自己输出一个'-'.3.P2继承P1的诸如环境变量,PC等环境,
2017-07-16 20:18:11 1535 11
原创 剑指offer 15---判断链表是否带环?若带环求环的长度?若带环求环的入口点?
判断链表是否带环?若带环求环的长度?若带环求环的入口点?判断链表是否带环?//判断链表是否带环bool IsCircle(ListNode* pHead){ if (pHead == NULL || pHead->_next == NULL) { return false; } //快慢指针法 ListNode* fast = pHead; ListNode* sl
2017-07-15 18:34:06 743
原创 剑指offer 16---单链表的逆置
单链表的逆置非递归实现#include #include using namespace std;struct ListNode{ int _value; ListNode* _next; ListNode(const int& value) :_value(value) , _next(NULL) {}};//单链表的逆置 非递归实现ListNode
2017-07-14 22:53:20 667
原创 剑指offer 46---实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。//实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。#include #include using namespace std;int Sum(int k) { return k >0 ? k + Sum(k - 1) : 0;}int main(){
2017-07-14 16:32:43 365
原创 剑指offer 47----实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--
实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--#include #include using namespace std;int Add(int& num1, int& num2){ if (num1 == 0) { return num2; } if (num2 == 0) { return num1; }
2017-07-14 15:44:15 1310 5
原创 剑指offer 15---查找单链表的倒数第k个节点,要求只能遍历一次链表
查找单链表的倒数第k个节点,要求只能遍历一次链表#include #include using namespace std;struct ListNode{ int _value; ListNode* _next; ListNode(const int& value) :_value(value) , _next(NULL) {}};//查找单链表的倒数第K个结
2017-07-14 14:30:44 810
原创 剑指offer 17---合并两个排序的链表
一.链表1:1 3 5 7 9 链表2:2 4 6 8 10 升序排列#include #include using namespace std;//合并两个有序链表,假设链表是升序排列//链表1:1,3,5,7,9 链表2:2,4,6,8,10struct ListNode{ int _value; ListNode* _next; ListNo
2017-07-13 15:56:34 447
原创 宏函数
define 在C语言中,有很多作用,除了一些基本的概念,定义常量以外,比较有意义的就是它所定义的宏函数一.两个数相加#define ADD(a,b) ((a)+(b))int main(){ int i = 6; int p = 17; int q = ADD(i, p); printf("ADD:%d\n", q); system("pause"); return
2017-07-09 22:21:17 593 6
原创 引用与指针比较
引用: 引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。 定义的格式为: 类型 &引用变量名=已经定义过的变量名;例如: int m; int &n=m; //此处n为m的别名引用的特点:1.一个变量可以有多个别名2.引用必须初始化3.引用只能在初始化的时候引用
2017-07-09 17:47:49 614 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人