- 博客(46)
- 资源 (20)
- 收藏
- 关注
原创 全排列(可排除重复)
首先我们来说一下这个问题的基本算法,其实很简单,是一个典型的递归算法:假设给定的字符串是 babc ([]中的为下一次递归的输入):1. abbc 排序: 让相等的字符连续2. a[bbc] 求解以第一个字符开头的组合 |3. b[abc] 发现第二个字符b和上一组组合的头a 不相等,所以调换,并求
2012-05-31 20:10:26 1930 2
原创 全组合(可包含重复字符)
利用链表保存结果,去除重复的串。#include #include using namespace std;#include using namespace std;typedef struct LNode{ char data[10]; LNode* next;}*List;void InsertList(List &l, char data[
2012-05-31 20:01:39 1353
原创 全排列(模板实现)
#include using namespace std;template void Perm(T a[], int k, int m){ if(k==m) { for(int i=0; i<=m; i++) cout<<a[i]; cout<<endl; } else { for(int i=k; i<=m; i++) {
2012-05-31 17:05:26 811
原创 调整数组顺序实现:奇数在偶数前面 以及 “奇偶奇偶”相间
题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。利用快排的两种实现方法,一种是前后两个指针向中间移动,另外一种是算法导论上快排的划分方法,也是两个指针,但都从头开始。算法一,前后两个指针#include #include using namespace std;bool isEven(i
2012-05-31 16:19:41 2414 3
原创 异常安全的CMyString赋值运算符函数重载
问题:给出如下CMyString的声明,要求为该类型添加赋值运算符函数。class CMyString{public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData;
2012-05-31 11:26:20 1242
原创 最长公共子序列(可打印LCS)
动态规划算法#include #include #include #include using namespace std;#define MAXSTRLEN 20int Lcs(char x[], char y[], int path[][MAXSTRLEN])//求序列x和y的最长公共子序列,path保存路径指向,以方便打印公共子序列{ int i,
2012-05-31 10:53:13 2417
原创 两个队列模拟一个栈
#include #include #include using namespace std;template class MyStack{ public: void push(T element) { if(q1.empty() && q2.empty()) q1.push(element); else if(!q1.empt
2012-05-30 11:34:28 1080
原创 两个栈模拟一个队列
两个栈模拟一个队列,1号栈为入队,栈顶表示队尾;2号栈为出队,栈顶表示队首。入队,直接进1号栈;出队,先判断2号栈是否有元素,有元素就直接弹出栈顶即队首,如果2号栈没有元素,则将1号栈的元素顺序弹出并进2号栈。#include #include #include using namespace std;templateclass CQueue{ public:
2012-05-30 11:07:18 5612
原创 从尾到头输出链表
1. 将链表逆序,然后从头到尾输出,需要额外操作;2. 顺序遍历过程中节点进栈,然后输出栈即可,需要额外的栈;3. 由栈转到递归。 #include using namespace std;typedef struct LNode{ int data; LNode* next;}*List;void InsertList(List &l, int d
2012-05-30 10:20:06 1317
原创 用C++ 设计一个不能被继承的类
分析:这是Adobe 公司2007 年校园招聘的最新笔试题。这道题除了考察应聘者的C++ 基本功底外,还能考察反应能力,是一道很好的题目。在Java 中定义了关键字final ,被final 修饰的类不能被继承。但在C++ 中没有final 这个关键字,要实现这个要求还是需要花费一些精力。首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类
2012-05-30 09:46:51 2378 1
原创 【谷歌面试题】在O(1)时间内删除链表节点
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 分析:这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解。在链表中删除一个结点,最常规的做法是从
2012-05-29 22:45:46 9614
原创 网易有道笔试:求连通图的割点(关节点)
题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。分析:1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);2. 通过深搜优先生成树来判定。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点为邻接点。由
2012-05-28 18:54:25 8643 3
原创 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径
有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。把字符串看成图中的一个顶点,两字符串匹配则两个顶点间有边,从而转化为图的问题。利用弗洛伊德算法求图的最长路径。#include #include using namespace std;
2012-05-27 14:56:03 4876 2
原创 弗洛伊德算法(求各顶点间最短路径):可打印最短路径
#include #include #include using namespace std;#define INFINITY 65535#define MAX_VERTEX_NUM 10typedef struct MGraph{ string vexs[10];//顶点信息 int arcs[10][10];//邻接矩阵 int vexnum, ar
2012-05-27 11:01:56 15050 2
原创 迪杰斯特拉算法(可打印最短路径)
#include #include #include using namespace std;#define INFINITY 65535//无边时的权值#define MAX_VERTEX_NUM 10//最大顶点数typedef struct MGraph{ string vexs[10];//顶点信息 int arcs[10][10];//邻接矩阵
2012-05-26 15:40:13 21741 6
原创 克鲁斯卡尔算法(最小生成树)
#include #include using namespace std;typedef struct MGraph{ string vexs[10];//顶点信息 int arcs[10][10];//邻接矩阵 int vexnum, arcnum;//顶点数和边数}MGraph;int LocateVex(MGraph G, string u)//返回
2012-05-26 10:33:24 4435
原创 普里姆算法(最小生成树)
#include #include using namespace std;typedef struct MGraph{ string vexs[10];//顶点信息 int arcs[10][10];//邻接矩阵 int vexnum, arcnum;}MGraph;typedef struct Closedge{ string adjvex; i
2012-05-25 23:17:39 7819 2
原创 拓扑排序(判断有向图是否有回路)
#include #include #include using namespace std;//表结点typedef struct ArcNode{ int adjvex;//该弧所指向的顶点的位置 ArcNode *nextarc;}ArcNode;//头结点typedef struct VNode{ string data;//顶点信息
2012-05-25 20:09:56 11082
原创 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
#include #include #include using namespace std;//表结点typedef struct ArcNode{ int adjvex;//该弧所指向的顶点的位置 ArcNode *nextarc;//指向下一条弧的指针}ArcNode;//头结点typedef struct VNode{ string da
2012-05-25 18:18:52 15180
原创 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
#include #include #include #include #include #include using namespace std;typedef struct MGraph{ string vexs[10];//顶点向量 int arcs[10][10];//邻接矩阵 int vexnum, arcnum;//图的顶点数和边数}MG
2012-05-25 14:14:58 4620 1
原创 谷歌笔试:已知实力对比关系和出场顺序,输出比赛名次
n支队伍比赛,分别编号为0,1,2,。。。n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n],w[i][j]的值代表编号为i,j的队伍中更强的一支。所以w[i][j]=i或者j, 现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n]={4,3,5,8,1。。。},那么第一轮比赛就是4对3,5对8.。。胜者晋级,败者淘汰。同一轮淘汰的所有队伍排名不再
2012-05-24 16:53:51 4598
原创 最大子矩阵和
将矩阵竖直方向投影相加,即可转化为一维最大子段和问题。#include using namespace std;//int a[3][5]={1,2,0,3,4,2,3,4,5,1,1,1,5,3,0};int a[4][4]={0,-2,-7,0,9,2,-6,2,-4,1,-4,1,-1,8,0,-2};int maxSum(int *a, int n, int &
2012-05-24 10:45:46 947
原创 字符匹配:查找包含字符集的子串-和谐系统
实现一个挺高级的字符匹配算法:给一串很长字符串,要求找到符合要求的字符串,例如目的串:123,1******3*****2,12******3这些都要找出来其实就是一些和谐系统。。与此题类似:给一个很长的字符串str, 还有一个字符集比如{a,b,c},找出str包含{a,b,c}的最短子串,要求O(n)。/*用两个变量 front,rear 指向一个的子串区间的头和尾(当然,
2012-05-23 19:36:51 4129 5
原创 1的数目
具体见《编程之美》解法一:从1到N遍历,求每个数中1的个数加和int Count1InInteger(int n){ int num=0; while(n) { num+=(n%10 == 1)?1:0; n/=10; } return num;}int f(int n){ int count=0; for(int i=1; i<
2012-05-23 09:32:30 829
原创 判断是否为栈的pop序列
输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。程序一:参考file:///F:/专业资料/微软面试题/题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。%20-%20Mr_Willy的专栏%20-%20博客频道%20-%20
2012-05-22 21:36:37 758
原创 整数二进制中1的个数
按照《编程之美》书上的方法int Count(int n){ int num=0; while(n) { if(n%2==1) num++; n/=2; } return num;}int Count(int n){ int num=0; while(n) { num+=n & 0x01; n>>=1; }
2012-05-22 16:23:38 533
原创 左旋转字符串
题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。思想:旋转三次#include #include using namespace std;void ReserveString(char *inp
2012-05-22 15:26:59 495
原创 字符串中找出连续最长的数字串
写一个函数,它的原型是int continumax( char *outputstr, char *intputstr),功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把最长数字串付给其中一个函数参数outputstr所指内存#include using namespace std;int continumax(char* &outputstr, char *i
2012-05-22 14:49:33 951
原创 带头结点的链表基本操作
#include using namespace std;typedef struct LNode{ int data; LNode* next;}LNode, *LinkList;void CreateList(LinkList &L, int len)//尾插法{ int data; LinkList p; L=new LNode; i
2012-05-22 10:05:06 760
原创 从数列1,2,3.......n 中 随意取几个数,使其和等于 m
其实是个背包问题。void FindSum(int sum, int n)//1到n和为m的所有组合{ static vector l; if(n<=0 || sum<=0 ) return; if(sum>n) { l.push_back(n); FindSum(sum-n, n-1); l.pop_back(); FindSum(su
2012-05-21 16:38:05 2487
原创 约瑟夫环问题
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字), 当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。求出在这个圆圈中剩下的最后一个数字。该题目是以下题目的变形。(n 个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下
2012-05-21 10:40:35 854
原创 二元查找树转换为它的镜像
二元查找树的镜像:左子树的节点都大于右子树的节点。#include #include using namespace std;struct BSTreeNode{ int m_nValue; BSTreeNode* m_pLeft; BSTreeNode* m_pRight;};void InsertNode(BSTreeNode* &pRoot, in
2012-05-21 08:37:05 945
原创 求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
方法一:利用构造函数和静态数据成员#include using namespace std;class Temp{public: Temp() { ++N; Sum+=N; } static void Reset() { N=0; Sum=0; } static int GetSum() { return
2012-05-19 21:20:56 8598 2
原创 二叉树中节点的最大距离
方法一:求二叉树中节点的最大距离,等同于“计算每个节点的左子树和右子树的高度和,取最大值”方法二:见编程之美(动态规划) #include #include using namespace std;typedef struct BiTNode{ char data; BiTNode *lchild, *rchild; int nMaxLeft, nMaxRi
2012-05-19 11:28:08 960
原创 翻转句子中单词的顺序
#include using namespace std;void Reverse(char *pB, char *pE){ if( pB == NULL || pE == NULL) return; while( pB < pE ) { char temp=*pB; *pB=*pE; *pE=temp; pB++; pE--
2012-05-19 08:55:49 683
原创 链表逆序
两种方法:1. 借助栈操作,先入栈,然后再出栈形成新的链表;2. 原地逆序。#include #include using namespace std;struct LinkNode{ int m_nValue; LinkNode* next;};typedef LinkNode* LinkList;void InsertList(LinkLis
2012-05-18 18:40:31 2274
原创 有环链表问题-确定有环链表的环起点,环长及柄长
#include #include using namespace std;struct LinkNode{ int m_nValue; LinkNode *next;};typedef LinkNode* LinkList;void InsertList(LinkList &list , int data)//插入(建立)链表{ LinkList
2012-05-18 15:02:53 1169
原创 判断链表是否有环
两个指针(初始值指向哪其实无所谓),一个步长为1,一个步长为2, 若相遇,则有环;反之,无环#include using namespace std;struct LinkNode{ int m_nValue; LinkNode* next;};typedef LinkNode* LinkList;void InsertList(LinkList &list
2012-05-18 10:26:02 546
原创 链表倒数第k个节点
两个指针一前一后,相距k即可。#include #include using namespace std;struct LinkNode{ int m_nValue; LinkNode *next;};typedef LinkNode* LinkList;void InsertList(LinkList& list , int data){
2012-05-18 09:53:49 689
原创 最小的k个元素
输入n个整数,输出其中最小的k个。分析:如果全部排序找出最小的k个,则时间复杂度为O(nlgn)。而其实题目要求的是最小的k个数,并不要求顺序,更不要求对整个序列有序。维护一个k个元素的最大堆,如果堆元素个数小于k个,则直接加入堆,如果堆元素个数等于k,则剩下的元素分别与堆顶元素比较,如果比堆顶元素还大,则不可能是最小的k个元素之一,如果比堆顶的元素小,则替换掉堆顶元素入堆,并重新调整堆,
2012-05-17 16:46:29 1070
C语言最新编程技巧200例(修订本)
2011-08-18
VISUAL C++ MFC扩展编程实例
2011-08-18
C++编程思想-讲解C++编程思想
2011-08-18
MFC可视化五子棋游戏
2011-08-06
软件工程软件设计文档模板
2011-08-06
基于B/S架构的教务管理系统C#&ASP.NET
2011-08-06
基于C/S架构的数据库课设-C#教务管理系统
2011-08-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人