自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 lua学习之metatable

最近一周简单学习了lua的基础内容,本文主要介绍了lua中metatable(元表),并利用metatable实现了lua中的继承。一、元表首先看什么是元表,元表本身只是一张普通的表,一般带有一些特殊的事件回调函数,通过 setmetatable被设置到某个对象上进而影响这个对象的行为。元表有什么用呢,用书中的一句话说就是“可以通过元表来修改一个值的行为,使其在面对一个非预定义的操

2015-02-11 14:52:03 581

原创 lua学习之coroutine

本文介绍了lua中的coroutine(协同程序),首先是协同程序的基本概念和常用的函数,然后展示了一个通过coroutine来解决”生产者—消费者“问题的示例,最后现了一个迭代器。一、基本概念和常用函数协同程序(coroutine)与线程类似,它拥有自己独立的栈、局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西。协程和线程的主要区别是,一个具有多个线程的程序可

2015-02-11 10:30:49 609

转载 程序员面试题精选100题(32)-不能被继承的类[C/C++/C#]

题目:用C++设计一个不能被继承的类。分析:这是Adobe公司2007年校园招聘的最新笔试题。这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字,要实现这个要求还是需要花费一些精力。首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数

2014-02-06 12:22:24 612

原创 malloc失败的一个原因

最近帮同学调一段程序,调试发现,程序其中的一个malloc函数返回值为空,我们知道如果申请分配的内存空间太大,系统无法获得符合要求的内存块,malloc函数会返回NULL,而这个程序中申请的空间是很小的,系统内存也很充裕,所以问题不在这儿。         后来仔细推敲代码,发现程序中在返回值为NULL的malloc之前,有过若干次的malloc,然而对申请到的空间初始化的范围大小超过了前边m

2014-01-17 10:43:02 5587

转载 程序员面试题精选100题(31)-从尾到头输出链表[数据结构]

题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{      int       m_nKey;      ListNode* m_pNext;};分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。看到这道题后,第一反应是从头到尾输出比较简单。于是很

2014-01-16 09:25:05 484

转载 程序员面试题精选100题(30)-赋值运算符重载函数[C/C++/C#]

问题:给出如下CMyString的声明,要求为该类型添加赋值运算符函数。class CMyString{public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData;};

2014-01-15 16:08:12 580

转载 程序员面试题精选100题(29)-调整数组顺序使奇数位于偶数前面[算法]

题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。分析:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于碰到一个偶数,需要移动O(n)个数字,因此总的时间复杂度是

2014-01-13 16:38:22 682

转载 程序员面试题精选100题(28)-字符串的排列[算法]

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符b

2014-01-10 10:26:00 424

转载 程序员面试题精选100题(27)-二元树的深度[数据结构]

题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如:输入二元树:                                            10                                          /     \                 

2014-01-08 21:44:17 405

转载 程序员面试题精选100题(26)-和为n连续正数序列[算法]

题目:输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。分析:这是网易的一道面试题。这道题和本面试题系列的第10题有些类似。我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于n的话

2014-01-07 18:33:57 387

转载 程序员面试题精选100题(25)-在从1到n的正数中1出现的次数[算法]

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。分析:这是一道广为流传的google面试题。用最直观的方法求解并不是很难,但遗憾的是效率不是很高;而要得出一个效率较高的算法,需要比较强的分析能力,并不是件很容易的事情。当然,google的面试题中简单的也没有几道。

2014-01-02 17:52:12 525

转载 程序员面试题精选100题(24)-栈的push、pop序列[数据结构]

题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,po

2013-12-31 17:44:15 657

转载 程序员面试题精选100题(23)-跳台阶问题[算法]

题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。分析:这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。

2013-12-27 16:23:22 528

转载 程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]

题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的

2013-12-25 16:07:59 581

原创 反转链表,递归方法

用递归的方法翻转链表,思路是先翻转链表头结点以后的其他结点,最后将头节点放在链表的尾部。若链表为空,则直接返空指针,若链表长度为1,则直接返回它。#include using namespace std;//定义链表结点struct ListNode{ int m_nKey; ListNode* m_pNext;};//创建链表void

2013-12-23 15:54:28 628

转载 程序员面试题精选100题(21)-左旋转字符串[算法]

题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我们可以新开辟一块长度为n+1的

2013-12-23 15:23:44 449

转载 程序员面试题精选100题(20)-最长公共子串[算法]

题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。

2013-12-20 16:14:16 604

转载 程序员面试题精选100题(19)-反转链表[数据结构]

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道广为流传的微软面试题。由于这道题能够很好的反应出程序员思维是否严密,在微软之后已经有很多公司在面试时采用了这道题。为了正确地反转一个

2013-12-19 11:16:17 545

转载 程序员面试题精选100题(18)-用两个栈实现队列[数据结构]

前几天实在太忙,今天继续,虽然是转载,但每天可以学习一点,进步一点。题目:某队列的声明如下:templatetypename T> class CQueue{public:      CQueue() {}      ~CQueue() {}      void appendTail(const T& node);  // append a el

2013-12-18 10:03:39 449

转载 程序员面试题精选100题(17)-把字符串转换成整数[算法]

题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题。建议读者在往下看之前自己先编写代码,再比较自己写的代码和下面的参考代码有哪些不同。

2013-12-12 16:48:20 506

转载 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]

题目:定义Fibonacci数列如下:        /  0                      n=0f(n)=      1                      n=1        \  f(n-1)+f(n-2)          n=2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci

2013-12-11 11:58:13 457

转载 程序员面试题精选100题(15)-含有指针成员的类的拷贝[C/C++/C#]

题目:下面是一个数组类的声明与实现。请分析这个类有什么问题,并针对存在的问题提出几种解决方案。templatetypename T> class Array{public:      Array(unsigned arraySize):data(0), size(arraySize)      {            if(size > 0)

2013-12-10 14:49:13 461

转载 程序员面试题精选100题(14)-圆圈中最后剩下的数字[算法]

题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:本题就是有名的约瑟夫环问题。既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列

2013-12-09 10:01:40 475

转载 程序员面试题精选100题(13)-第一个只出现一次的字符[算法]

题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析:这道题是2006年google的一道笔试题。看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路

2013-12-06 16:19:45 681

转载 程序员面试题精选100题(12)-从上往下遍历二元树[数据结构]

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入      8    /  \   6    10  /\     /\ 5  7   9  11输出8   6   10   5   7   9   11。分析:这曾是微软的一道面试题。这道题实质上是要求遍历一棵二元树,只不过不是我们熟悉的前序、中序或者后序

2013-12-05 17:30:50 473

转载 程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入:     8    /  \  6      10 /\       /\5  7    9   11输出:      8    /  \  10    6 /\      /\11

2013-12-04 11:38:03 467

转载 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]

题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和

2013-12-03 09:04:25 636

转载 程序员面试题精选100题(09)-链表中倒数第k个结点[数据结构]

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往

2013-12-02 20:13:05 494

转载 程序员面试题精选100题(08)-求1+2+...+n[C/C++/C#]

题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经

2013-11-29 09:02:12 482

转载 程序员面试题精选100题(07)-翻转句子中单词的顺序[算法]

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。

2013-11-28 11:29:14 606

转载 程序员面试题精选100题(06)-二元查找树的后序遍历结果[数据结构]

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:         8       /  \      6    10    / \    / \   5   7   9  11因此返回true。如果输入7、4、

2013-11-27 11:02:14 443

转载 程序员面试题精选100题(05)-查找最小的k个元素[算法]

题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以先创建一个大小为k的数据容器来存储最小的k个数字。接下来我们每次从输入的n个

2013-11-26 10:34:38 502

转载 程序员面试题精选100题(04)-二元树中和为某一值的所有路径[数据结构]

题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树                                            10                                           /   \

2013-11-25 15:56:53 449

转载 程序员面试题精选100题(03)-子数组的最大和[算法]

题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2

2013-11-22 17:53:10 632

转载 程序员面试题精选100题(02)-设计包含min函数的栈[数据结构]

题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个

2013-11-21 11:20:17 665

转载 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构

转自:http://zhedahht.blog.163.com/blog/static/254111742007127104759245/题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。  比如将二元查找树                                            10

2013-11-20 15:47:26 789 3

原创 数组、指针、数组指针、指针数组

一、类型 T 的指针和类型 T 的数组并非同种类型。    常常听说 char c[] 和 char *c 是一样的。    然而实际上并非如此。数组定义 char c[10] 请求预留 10 个字符的位置, 并用名称 “c” 表示。也就是说, 有一个称为 “c” 的位置, 可以放入 10 个字符。而指针申明 char *p, 请求一个位置放置一个指针, 用名称 “p” 表示。这个指针几乎

2013-11-19 19:24:35 578

转载 C++ 初始化列表

转自http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问

2013-11-14 10:01:31 429 1

转载 C语言中函数参数入栈的顺序

C语言中函数参数入栈的顺序先通过一个小程序来看一看:#include void foo(int x, int y, int z){printf("x = %d at [%X]\n", x, &x);printf("y = %d at [%X]\n", y, &y);printf("z = %d at [%X]\n", z, &z);}int

2013-10-10 09:37:08 556

空空如也

空空如也

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

TA关注的人

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