摘要: LinkList.h#ifndef LINKLIST_H#define LINKLIST_Htypedef int element;typedef struct ListNode{ element data; ListNode* next;}LNode;//初始化一个空链表void InitLinkList(LNode* *head);//计算链表的长度int LinkListLength(LNode* head);//插入操作:在位置i插入结点,结点数据为xbool InsertLinkList(LNode* head,int i, element x);//插入操作:在链表后依... 阅读全文
posted @ 2012-10-02 19:29 logzh 阅读(259) 评论(0) 推荐(0) 编辑
摘要: tree.h#ifndef TREE_H#define TREE_H#include <assert.h>typedef int element;/*定义二叉树*/typedef struct Node{ element data; Node* leftChild; Node* rightChild;}TreeNode;void PreOrder(TreeNode *root);//递归前序遍历void InOrder(TreeNode *root);//递归中序遍历void PostOrder(TreeNode *root);//递归后序遍历void IterationPr... 阅读全文
posted @ 2012-10-02 16:42 logzh 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 来自百度百科http://baike.baidu.com/view/536145.htmstatic成员必须在类外初始化C++中的static1、面向过程的static静态全局变量有以下特点: 该变量在全局数据区分配内存; 未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0); 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;全局变量和全局静态变量的区别: 1)全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局... 阅读全文
posted @ 2012-10-01 17:13 logzh 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个整型数组,数组里有整数也有负数。数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。分析:方法一:当我们加上一个正数时和会增加,当我们加上一个负数时,和会减少。如果当前和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。int FindMaxsumOfSubarray(const vector<int>& vec){ int sum=0; int MaxSum=0; for(vector<int>::size_type i=0; i<vec.size(); i++) { 阅读全文
posted @ 2012-10-03 14:21 logzh 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个整数和一棵二元树。从根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。分析:当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个 阅读全文
posted @ 2012-10-03 13:05 logzh 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 转自:http://blog.csdn.net/bingxuewujian/article/details/6089640题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,则将读入的整数直接放到数组中。否则长度为k的数组已经满了,不能再往数组里插入元素,只能替换 阅读全文
posted @ 2012-10-02 21:31 logzh 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题目:略分析:考虑二元查找树的后序遍历结果最后一位必是根节点,序列的前部分为树的左子树,后部分为右子树,其中左子树上的节点值都小于根节点的值,右子树上的节点值都大于于根节点的值。这样就成了一个 递归的操作。即把序列按照比根节点大小的关系分为左右两个部分,我们递归确认左右两部分是不是二元查找树的后序遍历结果即可。代码:int VertifySquenceOfBst(element list[], int length){ if(list ==NULL || length<=0) { return 0; } int i=0; int j=0; el... 阅读全文
posted @ 2012-10-02 21:20 logzh 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个英文句子,反转句子中单词的顺序,但是单词内字符顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字幕一样处理。分析:首先反转句子,再逐个单词反转。代码:注意while循环中对指针的操作;注意const在此处的用处;程序员面试题100题第21题——左旋转字符串char* ReverseString(char * const pStart, char * const pEnd)//反转字符串{ char *pS=pStart; char *pE=pEnd; if(pS != NULL && pE != NULL) { char temp... 阅读全文
posted @ 2012-10-02 20:57 logzh 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 分析:维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步前,第二个指针保持不动;第k-1步开始,第二个指针也开始一起遍历。这样两个指针之间的距离保持k-1;当第一个指针到达尾结点时,第二个指针正好遍历到倒数第k个结点。代码:略 阅读全文
posted @ 2012-10-02 19:41 logzh 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 解:从数组两端向数组的中间扫描。代码:略。 阅读全文
posted @ 2012-10-02 19:24 logzh 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 题目:求二元查找树的镜像(即交换左右子树),递归+迭代分析:其实操作和前序二叉树类似。void Mirror(TreeNode *root)//递归互换左右子树{ if(root == NULL) return ; TreeNode* p=root->leftChild; root->leftChild =root->rightChild; root->rightChild=p; //swap if(root->leftChild != NULL) Mirror(root->leftChild); if(root->righ... 阅读全文
posted @ 2012-10-02 17:13 logzh 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 题目:略分析:即层序遍历二叉树;参考二叉树的基本操作 阅读全文
posted @ 2012-10-02 16:55 logzh 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 题目:在一个字符串中找到第一个只出现一次的字符。分析:此类题型需要建立对应的hash字符数组,空间换时间; 对于指针切记要检查是否为NULL, 对于while循环不要忘记++或--代码:char FindFirstNotRepeatChar(char* pStr){ unsigned int arr[256]={0};//建立对应字符的hash数组 char* p=pStr; if(p==NULL) { return 0; } while(*p != '\0') { arr[*p]++;//计数, p++;... 阅读全文
posted @ 2012-10-02 16:14 logzh 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数字的环形列表,然后每次从这个列表中删除第m个元素。在参考代码中,我们用STL中std::list来模拟这个环形列表。由于list并不是一个环形的结构,因此每次跌代器扫描到列表末尾的时候,要记得把跌代器移到 阅读全文
posted @ 2012-10-02 15:50 logzh 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 题目:定义Fibonacci数列f(1)=0;f(2)=1;...f(n)=f(n-1)+f(n-2);输入n,用最快的方法求该数列的第n项;分析:略代码:struct Matri2By2//定义2*2矩阵{ Matri2By2(unsigned long m00, unsigned long m01, unsigned long m10, unsigned long m11):m_00(m00),m_01(m01),m_10(m10),m_11(m11) {};//结构体的构造函数 unsigned long m_00; un... 阅读全文
posted @ 2012-10-02 15:15 logzh 阅读(380) 评论(0) 推荐(0) 编辑
摘要: 题目:把输入的字符串转化为整数,如:“-456” 输出456、“+456”输出456,“456”输出“456”,如果是非法输入,则输出0,并提示错误。代码:long long strToNum( const char* pStr){ long long num=0; int flag=1; if(pStr==NULL) { cout << "is null!\n"; return 0; } if(*pStr=='-') { flag=-1; pStr++; }else if(... 阅读全文
posted @ 2012-10-02 10:58 logzh 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 题目:两个栈实现队列分析:假设两个栈分别为stk1,stk2;队列的两个操作为入列和出列入列操作:是对栈stk1的入栈操作;出列操作:if stk2为空 { stk1全部出栈,分别顺序入栈到stk2中 }assert(stk2不为空)stk2出栈 阅读全文
posted @ 2012-10-01 21:52 logzh 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 1 、链表相邻元素翻转2 、题目:输入一个链表的头结点,反转该链表,返回反转后链表的头结点;LNode* ReverseLinkList(LNode* head)//带头结点{ if(head == NULL)//注意 return head; LNode* p=head->next; LNode* temp=NULL; LNode* trail=NULL; while(p != NULL) { //4句 temp=p; p=p->next; temp->next=trail; tra... 阅读全文
posted @ 2012-10-01 21:40 logzh 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 题目:把字符串前n个字符移到字符串的尾部。如:abcdef左旋转2位得到字符串cdefab;分析得:左旋转其实为3个反转操作!代码如下:(主要const的使用)const在*左边修饰指针指向的内容,即内容不能修改const在*右边修饰指针本身,即指针本身不能修改即//左内容右本身char* ReverseString(char * const pStart, char * const pEnd)//反转字符串{//const不修改指针 //左内容右本身 char *pS=pStart; char *pE=pEnd; if(pS != NULL && pE != NULL) .. 阅读全文
posted @ 2012-10-01 21:31 logzh 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个整数n,求n的2进制表示中1的个数分析可得:n&(n-1)的操作是将n的2进制表示中最右边的1变成0;所以能得到对应的代码:int numOf1(int n){ int count=0; while(n) { count++; n=n&(n-1); } return count;}同理判断n是不是2的整数次幂return !(n&(n-1)); 阅读全文
posted @ 2012-10-01 21:25 logzh 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 跳台阶问题:实际是一种Fibonacci序列问题Fibonacci序列问题(程序员面试题100题第16题——O(logN)求Fibonacci数列),可以转化为矩阵乘法问题,或者记忆数组问题;代码略。 阅读全文
posted @ 2012-10-01 21:08 logzh 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 题目:输入两个字符串(整数或字母),第一个表示为栈的push顺序,判断另外一个是不是对应的pop序列;为简单起见,我们假设push序列的任意两个字符不相等。代码:bool IsPossiblePopOrder(const char* pPush,const char* pPop){ stack<char> stk; const char* p=pPush; const char* q=pPop; if(strlen(p) != strlen(q)) { return false; } while( *p!='\0') { ... 阅读全文
posted @ 2012-10-01 21:05 logzh 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个正数n,输出所有和为n连续正数序列。例如输入15,输出1 2 3 4 5、4 5 6、7 8void PrintContinuesSequence(int small, int big){ for(int i=small; i<=big; ++i) cout << i <<" "; cout << endl;}void FindContinuesSequence(int n){ if (n<3) return; int small=1; int big=2; int middle=(1+n)/2;//用于判断结束 阅读全文
posted @ 2012-10-01 19:59 logzh 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一字符串,输出字符串的所有排列分析:我们以三个字符abc为例。首先我们固定第一个字符a,求后面两个字符bc的全排列。当bc的排列求好之后,这就是一部分解;现在我们把第一个字符a和后面的字符b交换得到bac,固定第一个字符b,求后面两个字符ac的全排列。当ac的排列求好之后,这是另外一部分解;接着我们该把c放在第一个位置了,为了确保这次c是和原先处于第一位置的a交换,必须把b和a交换回来,得到abc,然后再把c交换到第一位置得到cba,固定第一个字符c,求后面两个字符ba的全排列。当ba的排列求好之后,这是另外一部分解;三部分解组成所有的解。又如abcdabcda{bcd的排列}//得 阅读全文
posted @ 2012-10-01 19:28 logzh 阅读(485) 评论(0) 推荐(0) 编辑
摘要: bool isEven_(int n)//是否是偶数{ return (n&1)==0;}int gcd(int x, int y)//注意递归的基准情况和x,y同为偶数的情况{ if(x<y) { return gcd(y,x); } if(y==0) return x; //以上两步为递归算法中的基准情况!! if(isEven_(x)&&isEven_(y)) { return (gcd(x>>1,y>>1))<<1;//x>>1 x/2 }else if(isEven_(x)&&!isEve. 阅读全文
posted @ 2012-10-01 16:27 logzh 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 思想完全是采用快速排序:bool isEven_(int n)//是否是偶数{ return (n&1)==0;}void swapOddEven(int arr[], int left, int right){ int i=left; int j=right; int temp=arr[left]; if(left > right) { return ; } while(i<j) { while(i<j && isEven_(arr[j])) j--; arr[i]=arr[... 阅读全文
posted @ 2012-10-01 16:25 logzh 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 将一个很长的字符串,分割成一段一段的子字符串,子字符串都是回文字符串。有回文字符串就输出最长的,没有回文就输出一个一个的字符。例如:habbafgh输出h,abba,f,g,h。bool isPalindrome(const string& str,string::size_type i, string::size_type j)//判断是否回文{ if(i>str.length() || i>j || j>str.length()) { cout << "err!"; return false; } for( ;i<j;i++, 阅读全文
posted @ 2012-09-29 14:36 logzh 阅读(544) 评论(0) 推荐(0) 编辑
摘要: /*输出波峰波谷*/void printArrPeakValley(const int* arr, int len ){ // vector<int> iv(arr,arr+len); vector<int> result; result.push_back(iv[0]); int temp=iv[0]; int maxDis=iv[0]; vector<int>::size_type i=1; int flag=0; for(;i<iv.size();) { while(i<iv.size() && temp == i... 阅读全文
posted @ 2012-09-29 08:44 logzh 阅读(524) 评论(0) 推荐(0) 编辑
摘要: 找工作ing 阅读全文
posted @ 2012-09-28 16:31 logzh 阅读(129) 评论(0) 推荐(0) 编辑
摘要: void test()/*百度:100个灯泡,第一轮所有灯泡打开,第二轮每隔一个灯泡关掉, 即排在偶数的灯泡都被关掉,第三轮每隔两个灯泡,将开着的灯泡关掉, 关掉的灯泡打开,依次类推,第100轮结束的时候还有几盏灯泡亮着*/{ bitset<101> b; b.set(); int count=2; int maxCount=100; int len=1; for(int i=count; i<=maxCount; i++) { len++; for(int j=0; j<b.size... 阅读全文
posted @ 2012-09-28 11:33 logzh 阅读(306) 评论(0) 推荐(0) 编辑
摘要: //验证输入的表达式是不是正确的四则运算,不考虑负数bool isValidExpression(const string& expression){ stack<char> s; vector<char> v; for(int i=0; i<expression.size(); i++) { switch(expression[i]) { case '(': s.push('(');//'('入栈 break; case ')': if(s.emp... 阅读全文
posted @ 2012-09-28 11:32 logzh 阅读(673) 评论(0) 推荐(0) 编辑
摘要: //输出字符串中所有最长的无重复字符的子字符串void allMaxChildNoRepeatCharacter(const string& str){ string s=str; vector<int> ia(2); int len=0;//记录当前最长的无重复字符的子字符串 for(int start=0,end=1; end<s.length(); end++) { for(int i=start; i<end; i++) { if(s[i]==s[end]) { ... 阅读全文
posted @ 2012-09-27 17:28 logzh 阅读(518) 评论(0) 推荐(0) 编辑
摘要: 转自:http://www.cnblogs.com/graphics/archive/2010/07/07/1772733.html一:为什么静态成员不能在类内初始化在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样class A{ private: static int count ; // 类内声明};int A::count = 0 ; // 类外初始化,不必再加static关键字为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。二:什么在类内初始化能在类中初始化的成员只有一... 阅读全文
posted @ 2012-09-24 11:01 logzh 阅读(304) 评论(3) 推荐(0) 编辑
摘要: 拓扑排序的步骤: (1)从图中选择一个入度为0的顶点且输出之; (2)从图中删掉该顶点及其所有以该顶点为弧尾的弧;反复执行这两个步骤,直到所有的顶点都被输出,输出的序列就是这个无环有向图的拓扑序列。 阅读全文
posted @ 2012-09-24 08:44 logzh 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 找出两个单链表里交叉的第一个元素解法:分别遍历list1、list2,计算得到L1,L2;比较最后结点是否相等,相等则表明是两个链表是交叉的如果交叉:长的链表先移动|L1-L2|步,再逐个比较,等到第一个交点! 阅读全文
posted @ 2012-09-18 11:24 logzh 阅读(1073) 评论(0) 推荐(0) 编辑
摘要: 链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->gLNode* ReverseLinkList3(LNode* head){ if(head == NULL) return head; LNode* p; LNode* temp; LNode* trail=head; while(trail->next !=NULL && trail->next->next != NULL) { //防止无限循环,在测试是设置一个循环标记位! p=tra 阅读全文
posted @ 2012-09-18 10:51 logzh 阅读(620) 评论(0) 推荐(0) 编辑
摘要: 解法三:考虑数组的第一个元素A[0],以及最大的一段数组(A[i]...A[j])跟A[0]的关系,有一下三种情况:1、0=i=j 元素A[0]本身构成和最大一段;2、0=i<j 和最大一段从A[0]开始3、0<i 和最大一段和A[0]没有关系所以假设:已经知道(A[1]...An-1])的最大和段之和为all[1];(A[1]...An-1])的包含A[1]的最大和段之和为start[1];那么all[0]=max{A[0], A[0]+start[1], all[1]};而start[0]=max{A[0], A[0]+start[1]};所以all[0]=max{star.. 阅读全文
posted @ 2012-09-18 10:15 logzh 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个 1 string test(string s) 2 { 3 string ns; 4 int flag=0; 5 int count=0; 6 for(int i=0; i<s.length(); i++) 7 { 8 if(flag==0 && s[i]==' ')//删除字符串首空格 9 {10 continue;11 }12 13 if(s[i] != ' ')//不是空格14 ... 阅读全文
posted @ 2012-09-18 09:36 logzh 阅读(1067) 评论(0) 推荐(0) 编辑
摘要: ubuntu 12.04下LAMP安装配置一. LAMP 的安装1.sudo apt-get install apache2 mysql-server mysql-client php5 php5-gd php5-mysql(如果遇到以下错误:E: 无法获得锁 /var/cache/apt/archives/lock - open (11: 资源暂时不可用)E: 无法对目录 /var/cache/apt/archives/ 加锁输入命令:sudo rm /var/cache/apt/archives/lock类似的无法获得锁的错误可能需要sudo rm /var/lib/dpkg/locksu 阅读全文
posted @ 2012-09-11 21:19 logzh 阅读(534) 评论(0) 推荐(0) 编辑
摘要: Ubuntu 配置 opencv , CodeBlocks 开发环境转自:主要:http://blog.csdn.net/cenziboy/article/details/7570139参考:http://blog.csdn.net/yr119111/article/details/7666106一、安装CodeBlocks(我用的是方法一)方法一:直接在Ubuntu软件中心中找到CodeBlocks软件,直接安装;方法二:命令行安装# apt-get install codeblocks# apt-get install codeblocks-contrib # wxWidgets 貌似要用 阅读全文
posted @ 2012-09-09 10:33 logzh 阅读(6338) 评论(0) 推荐(0) 编辑