自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 Windows程序设计的第一个实例

之前一直学习的是控制台程序设计,后来接触MFC程序设计,中间忽略了Windows程序设计的学习,所以在开始接触MFC的时候非常迷茫,不知道MFC框架下的各个函数的意义,不明白其内部的原理及机制,只大概了解使用了函数的封装,现在将这部分知识重拾起来。使用c语言,调用WIN32 API进行Windows程序设计,首先要包含windows.h头文件,入口函数是WinMain函数,这点不同于控制台程序

2016-07-28 10:38:31 4097

转载 TCP协议中的三次握手和四次挥手(图解)

原文网址:点击打开链接建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:先来看看如何建立连接的。首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。那如何断开连接呢?简

2016-07-26 10:01:29 380

转载 C结构体之位域(位段)

原文网址:点击打开链接有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把

2016-07-19 20:44:32 7904 1

转载 c语言中内存的动态分配与释放(多维动态数组构建)

原文网址:点击打开链接一. 静态数组与动态数组   静态数组比较常见,数组长度预先定义好,在整个程序中,一旦给定大小后就无法再改变长度,静态数组自己自动负责释放占用的内存。   动态数组长度可以随程序的需要而重新指定大小。动态数组由内存分配函数(malloc)从堆(heap)上分配存储空间,只有当程序执行了分配函数后,才为其分配内存,同时由程序员自己负责释放分配的内存(free)。

2016-07-17 19:52:02 5675

转载 螺旋队列实现

原文链接:点击打开链接螺旋队列的样子如下图:两大规律:1、螺旋规律2、奇数(圈数,或X轴正坐标)平方规律(紫线) 问题描述: 设1的坐标是(0,0),x方向向右为正,y方向向下为正,例如,7的坐标为(-1,-1),2的坐标为(1,0)。编程实现输入任意一点坐标(x,y),输出所对应的数字!  问题解决:

2016-07-17 09:58:55 486

原创 二叉搜索树与双向链表

题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路:方法一:非递归版中序遍历使用二叉树的非递归的中序遍历,while双层循环,不断将节点压入栈中,当某个节点不存在左儿子时,就弹出该节点访问其右孩子,每次保存当前遍历节点到pre指针,正在访问节点指针为p,令pre和p建立双向链表连接关系即可。方

2016-07-15 11:02:08 351

原创 判断B是否为A的子结构

题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路:从A的根节点开始与B树进行匹配,若节点值相同就继续匹配左右孩子节点,若出现不同就从A的左右孩子开始匹配B的根节点,直到在A中找到一个与B节点完全相同的子结构。可以采用两个模块完成,HasSubtree函数用于判断根节点是否一致,递归调用,IsSubtree函数用于判断其余节点是否一致,

2016-07-14 10:15:28 1001

原创 CrackingtheCodeInterview之中等难题

NO.1 编写一个函数,不用临时变量,直接交换两个数。解法:已知a,b,交换a和b,可以:a=a-b; b=b+a; a=b-a;也可以:a^=b; b^=a; a^=b;NO.2 设计一个算法,判断玩家是否赢了井字游戏。解法1:井字游戏包含9个格子,每个格子的结果有3种情况,空、红和蓝,可以将每个格子 的情况表示为012,然后计算9个格子构成的3进制数,需要提前需处理计算每种情况

2016-07-10 17:13:19 601

原创 BAT实习内推笔试卷(第一场)

NO.1   给定一个长度不小于2的数组arr。 写一个函数调整arr,使arr中要么所有的偶数位上都是偶数,要么所有的奇数位上都是奇数上。 要求:如果数组长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1),下标0,2,4,6...算作偶数位,下标1,3,5,7...算作奇数位,例如[1,2,3,4]调整为[2,1,4,3]即可解答:题目要求是或者只要有一个条件满足即可结束,所以

2016-07-09 21:24:46 812

原创 CrackingtheCodeInterview之C与C++

NO.1 用C++写个方法,打印输入文件的最后K行。解法:第一种方法,读取文件获取文件总行数,再次读取文件从N-K+1行开始读取直到结束。第二种方法,使用循环式数组,将读取的每一行放入字符串数组中,当i大于k时,令i mod K作为字符串数组的序号,覆盖原字符串。NO.2 比较并对比散列表和STL map。散列表是如何实现的?如果输入的数据量不大,可以选用哪些数据结构替代散列表?解

2016-07-09 17:06:42 423

原创 CrackingtheCodeInterview之排序与查找

NO.1 给定两个排序后的数组A和B,其中A的末端有足够的缓冲空容纳B。编写一个方法,将B合并入A并排序。解法:联系插入排序,遍历B中元素,逐个插入到A中即可。NO.2 编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置。解法:变位词如word与rowd就是一组,首先将字符串排序,作为键值插入到哈希表中,最后再将哈希表复制到数组中即可。NO.3 给定一个排序后的数组,包

2016-07-09 11:07:46 367

原创 CrackingtheCodeInterview之递归和动态规划

NO.1 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一个方法,计算小孩有多少种上楼梯的方式。解法:试想小孩在上到第n阶台阶前可能选择了一次上几阶台阶,1/2/3都有可能,所以子问题是第n-1阶台阶、第n-2阶台阶和第n-3阶台阶这些方法的和。因此,按照这种递归去解决问题即可,时间复杂度为O(3^n)。采用动态规划的方法可以避免重复的计算,保存每一层台阶实现的方法,

2016-07-07 21:43:33 679

转载 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

分治算法一、基本概念   在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……    任何一个可以用计算机求解的问题

2016-07-06 16:15:20 1072

转载 ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?,cinscanf

原文网址:点击打开链接在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化

2016-07-06 09:47:06 8357 1

转载 结构体字节对齐

原文1网址:点击打开链接 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。      内存对齐的原

2016-07-05 19:25:32 418

原创 CrackingtheCodeInterview之数学与概率

NO.1 有个篮球框,下面两种玩法可任选一种。玩法1:一次出手机会,投篮命中得分。玩法2:三次出手机会,必须投中两次。如果p是某次投篮命中的概率,则p的值为多少时,才会选择玩法1或玩法2?解法:玩法1成功的几率为p,玩法2成功的几率为p*p+p*(1-p)*p+(1-p)*p*p=3p*p-2*p*p*p,比较两者当p0.5时方法2较好。NO.2 三角形的三个顶点上各有一只蚂蚁。如果蚂蚁开

2016-07-05 16:50:49 566

原创 CrackingtheCodeInterview之智力题

例题1. 给定两条绳子,每条绳子燃烧殆尽正好要用一个小时。怎样用这两条绳子准确计量15分钟?注意这些绳子密度不均匀,因此烧掉半截绳子不一定正好用半个小时。解法:一条绳子从两端同时点燃,则燃烧殆尽时要用半个小时,若A绳子两端同时点燃,而B绳子点燃一端,在A绳子燃烧殆尽后,再点燃B的另一端,就能计量出15分钟了。例题2:“九球称重”是一个经典面试题。给定9个球,其中8个球的重量相同,只有一个比

2016-07-05 14:58:58 838

原创 CrackingtheCodeInterview之位操作

NO1. 给定两个32位的整数N与M,以及表示比特位置的i与j。编写一个方法,将M插入N,使得M从N的第j位开始,到第i位结束。假定从j位到i位足以容纳M,也即若M=10011,那么j和i之间至少可容纳5个位。例如,不可能出现j=3和i=2的情况,因为第3位和第2位之间放不下M。示例:输入:N=1000 0000 0000 0000, M=1 0011,i=2,j=6   输出:N=100

2016-07-04 19:33:16 391

原创 CrackingtheCodeInterview之树与图

NO.1 实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过1。方法1:递归调用getHeight(left)和getHeight(right)函数,比较差值是否大于1,访问每一个节点判断其是否符合平衡条件,时间复杂度为O(N*logN)。int getHeight(node root){ if(!root) return 0;

2016-07-03 20:01:06 330

原创 CrackingtheCodeInterview之栈与队列

NO.1 请描述如何只用一个数组来实现三个栈?固定长度栈方法:等分数组实现三个栈可变长度栈方法:1、2号栈挨着,3号栈从数组尾部开始,每次往1中压入和弹出操作时,需动态调整2号栈,这是缺陷。NO.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素的最小值。push、pop和min方法的时间复杂度必须为O(1)。1:修改node节点结构体,增加一个min标记变量

2016-07-03 10:46:15 304

转载 snprintf和sprintf区别分析

原文网址:http://my.oschina.net/shelllife/blog/177279今天在项目中使用snprintf时遇到一个比较迷惑的问题,追根溯源了一下,在此对sprintf和snprintf进行一下对比分析。因为sprintf可能导致缓冲区溢出问题而不被推荐使用,所以在项目中我一直优先选择使用snprintf函数,虽然会稍微麻烦那么一点点。这里就是sprintf和sn

2016-07-03 09:03:44 1152

原创 CrackingtheCodeInterview之链表

NO1. 编写代码,移除未排序链表中的重复节点。使用set存储链表元素,判断set中是否已经存在,若存在就删除。这种方法的时间复杂度为O(N),空间复杂度为O(N)。进阶如果不得使用临时缓冲区,该怎么解决?基本解法:针对每一个链表节点,遍历链表的所有其他节点,若存在重复的就删除。时间复杂度为O(N^2),空间复杂度为O(1)。NO2. 实现一个算法,找出单向链表中倒数第k个

2016-07-02 16:35:04 287

原创 CrackingtheCodeInterview之数组与字符串

//NO.1//实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理?初步想法:将字符串排序,然后比较相邻元素是否相同。较好思路:1、字符串分为ASCII和Unicode两种,ASCII码共256种,Unicode码共65536种,可以定义bool型数组,并初始化为false,遍历字符串,每次将字符对应的bool型变量改为true,每次更改

2016-07-01 21:21:36 294

转载 来谈谈C++ 位运算 & | << >> ^ ~ %

原文网址:http://www.linuxidc.com/Linux/2014-03/98362.htm老实说,我对+ = * / % && || ==一些比较简单的运算符比较熟悉。对位运算就陌生了,主要用的少。我觉得高手用的会比较多,因为位运算速度比较快。位运算应该适用于大多数的语言,不限于c++ 1.& 如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。注:下

2016-07-01 16:24:27 722

空空如也

空空如也

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

TA关注的人

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