数据结构及算法
文章平均质量分 68
cxllyg
追求技术~
展开
-
整数二进制中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 · 541 阅读 · 0 评论 -
谷歌笔试:已知实力对比关系和出场顺序,输出比赛名次
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 · 4610 阅读 · 0 评论 -
复杂链表的复制
题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。其结点的C++定义如下: struct ComplexNode{ int m_nValue; ComplexNode* m_原创 2012-06-14 09:02:48 · 3506 阅读 · 4 评论 -
拓扑排序(判断有向图是否有回路)
#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 · 11106 阅读 · 0 评论 -
迪杰斯特拉算法(可打印最短路径)
#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 · 21764 阅读 · 6 评论 -
图的基本操作(基于邻接表):图的构造,深搜(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 · 15209 阅读 · 0 评论 -
图的基本操作(基于邻接矩阵):图的构造,深搜(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 · 4632 阅读 · 1 评论 -
普里姆算法(最小生成树)
#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 · 7837 阅读 · 2 评论 -
克鲁斯卡尔算法(最小生成树)
#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 · 4452 阅读 · 0 评论 -
最大子矩阵和
将矩阵竖直方向投影相加,即可转化为一维最大子段和问题。#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 · 959 阅读 · 0 评论 -
字符匹配:查找包含字符集的子串-和谐系统
实现一个挺高级的字符匹配算法:给一串很长字符串,要求找到符合要求的字符串,例如目的串:123,1******3*****2,12******3这些都要找出来其实就是一些和谐系统。。与此题类似:给一个很长的字符串str, 还有一个字符集比如{a,b,c},找出str包含{a,b,c}的最短子串,要求O(n)。/*用两个变量 front,rear 指向一个的子串区间的头和尾(当然,原创 2012-05-23 19:36:51 · 4146 阅读 · 5 评论 -
判断是否为栈的pop序列
输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。程序一:参考file:///F:/专业资料/微软面试题/题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。%20-%20Mr_Willy的专栏%20-%20博客频道%20-%20原创 2012-05-22 21:36:37 · 769 阅读 · 0 评论 -
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 · 842 阅读 · 0 评论 -
旋转数组中的最小元素
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。我原创 2012-06-13 15:34:59 · 3682 阅读 · 4 评论 -
颠倒栈
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过来了。颠倒一个数组是一件很容易的事情。不过这种思路需要显示分配一个长度为O(n)的数组,而且原创 2012-06-12 14:26:12 · 4418 阅读 · 0 评论 -
扑克牌的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。接下来我们来分析怎样判断5个数字是不是连续的。最直观的是原创 2012-06-12 22:57:20 · 5402 阅读 · 0 评论 -
n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。分析:骰子一共6个面,每个面上都有一个点数,对应的数字是1到 6之间的一个数字。所以,n个骰子的点数和的最小值为n,最大值为6n。因此,一个直观的思路就是定义一个长度为6n-n的数组,和为S的点数出现的次数保存到数组第S-n个元素里。另外,我们还知道n个骰子的所有点数的排列数6^n。一旦我们统计原创 2012-06-13 10:28:02 · 1529 阅读 · 0 评论 -
【百度面试题】把数组排成最小的数
问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab ba,原创 2012-06-13 14:48:27 · 11931 阅读 · 7 评论 -
链表逆序
两种方法: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 · 2289 阅读 · 0 评论 -
弗洛伊德算法(求各顶点间最短路径):可打印最短路径
#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 · 15061 阅读 · 2 评论 -
Trie树的基本操作
#include #include #include #define MAX 26using namespace std;typedef struct TrieNode{ bool isStr;//标记该节点处是否构成单词 struct TrieNode* next[MAX];//孩子分支}Trie;void insert(Trie *root, con原创 2012-09-16 20:26:35 · 903 阅读 · 2 评论 -
给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。
#include #include using namespace std;int rand5(){ return (rand()%5+1);}void main(){ int a; while((a=rand5()*5+rand5())>26); cout<< (a-3)/3<<endl;}代码解释:1. 通过 rand5()*原创 2012-09-19 18:49:13 · 2069 阅读 · 0 评论 -
不使用中间变量实现strlen函数
2009腾迅校园招聘笔试题:不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数。函数接口声明如下:int strlen(const char *p);思路分析: “不使用中间变量”是说程序员不能显式的申请内存,即不能有局部变量或者动态内存申请。如果函数自动申请栈内存或者使用寄存器存储变量,或者使用立即数寻址即常量,那么就相当于“不使用中间变量”。从函数原原创 2012-09-20 14:28:18 · 2495 阅读 · 0 评论 -
【百度2012年10月20日笔试】2.求字符串中连续重复字母的最大重复次数, 如: aabbbbcadd 的最大字母重复次数为 4, 有四个连续的b. 要求用递归实现.
#include using namespace std;int CountLengest(char* pBuf){ int result=0; char *p=pBuf; if(*pBuf=='\0') return result; while((*pBuf!='\0') && (*p==*pBuf)) { result++; pBuf+原创 2012-11-05 09:42:54 · 1734 阅读 · 0 评论 -
【百度2012年10月20日笔试】1.一个数被3除余2,被5除余3,被7除余2,求满足条件的前N个数。
用“迭代法”求解(通用的解法)1)从“最大的除数7”开始思考:假设要求的这个数设为N=7a+2,(a=1,2,3……)2)考虑其余的条件:被3除余2。即: 3│7a+2-2, 整理得:3│a,即:a=3b,(b=1,2,3……) N=7×3b+2=21b+23)考虑最后一个条件:被5除余3。即: 5│21b+2-3, 整理得:5│b-1,即:b=1+5c,原创 2012-11-05 09:47:18 · 5274 阅读 · 3 评论 -
【并查集】判断是否为树
【问题描述】树是一种大家都不陌生的数据结构,它有可能是一颗空树或是一些满足要求的节点连接而成的有向边的集合。一棵树只有一个根节点,根节点没有指向它的边。除了根节点的每一个节点都只有一条边指向它。出现环的图都不是树。对一些节点连接而成的有向边的集合进行判定,判定每一组的输入数据构成的图是否是一棵树。【输入】每输入一对都为0的数时,表示一组数据输入完毕。每条边由一对正整数表原创 2012-11-26 15:05:42 · 3396 阅读 · 0 评论 -
会场安排问题
【问题描述】假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数。)【数据输入】第一行有1个正整数k,表示有k个待安排的活动。接下来的k行中,每行有两个正整数,分别表示k个待安排的活动开始时间和活动结束时间。时间以0点开始的分钟计。原创 2012-11-19 17:31:54 · 15476 阅读 · 5 评论 -
【贪心】活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起原创 2012-11-22 15:46:42 · 6949 阅读 · 2 评论 -
【贪心】删数问题
【问题描述】给定n位整数q,去掉其中任意k比如,178543删除四个数字后,最小的新数是13。贪心策略:最近下降点优先。#include #include #include using namespace std;void delek(vector &s, int k){ int n=s.size(); if(k>=n) ; else原创 2012-11-22 17:13:54 · 1963 阅读 · 0 评论 -
【回溯法】n皇后问题
一。递归回溯#include using namespace std;#define N 8int sum=0;int *x=new int[N+1];bool place(int k){ int i; for(i=1; i<k; i++) { if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k])) ret原创 2012-10-10 11:23:06 · 10733 阅读 · 1 评论 -
N!末尾0的个数
参考编程之美2.2不要被阶乘吓倒N!末尾0的个数,即等于因子10的个数,又10=2*5,所以N!末尾0的个数即因子5的个数(因为能被2整除的数出现的频率比能被5整除的数高得多)。#include using namespace std;int Count1(int n){ int count=0; int j; for(int i=1; i<=n; i++)原创 2012-09-18 14:06:34 · 1523 阅读 · 1 评论 -
字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小 .
#include #include using namespace std;char* MoveStar(char s[]){ if(!s) return NULL; int StarCount=0; int len=strlen(s); for(int i=len-1; i>=0; i--) { if(s[i]=='*') StarCount原创 2012-09-16 21:34:30 · 2129 阅读 · 0 评论 -
【回溯法】实现给定二进制位数的所有组合
#include using namespace std;#define N 4int *x=new int[N];void backtrack(int t){ int i=0; if(t>N-1) { for(i=0; i<N; i++) cout<<x[i]<<" "; cout<<endl; } else {原创 2012-10-08 10:14:09 · 2117 阅读 · 0 评论 -
链表相邻元素翻转
链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g 解:三个指针,p和q两个节点作为一组处理,pre用于链接不同组的节点。#include #include using namespace std;typedef struct LNode{ int data; struct LNode* next;}原创 2012-09-16 15:31:53 · 2136 阅读 · 1 评论 -
删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个。
#include #include #include void DelSpace(char s[]){ char *p=s; int FlagOfFront=1; int j=0; while(*p!='\0') { if(*p!=' ') s[j++]=*p; else { while(*p==' ') p++;原创 2012-09-16 15:47:29 · 1859 阅读 · 0 评论 -
两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值
【题目描述】两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];要求:1.不准用除法运算2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等)3.满足时间复杂度O(n),空间复杂度O(1) 【题目来源】腾讯2012 【题目分析转载 2012-09-17 11:08:47 · 3174 阅读 · 0 评论 -
二叉树先序,中序,后序遍历非递归实现
利用栈实现二叉树的先序,中序,后序遍历的非递归操作#include #include #include #include #include #include using namespace std;typedef struct BiTNode{ char data; BiTNode *lchild, *rchild;}BiTNode,*BiTree;原创 2012-04-28 14:30:02 · 83957 阅读 · 17 评论 -
洗牌算法:随机打乱一个数组的顺序
给定一个数组,要求把数组内元素的顺序随机打乱,然后输出,主要是要保证效率。这其实是个洗牌算法,首先从所有元素中随机选取一个与第一个元素进行交换,然后在第二个之后选择一个元素与第二个交换,直到最后一个元素。这样能确保每个元素在每个位置的概率都是1/n。 #include #include #include #include using namespace std;原创 2012-09-17 09:37:23 · 36141 阅读 · 2 评论 -
大数相乘
利用字符串处理大数#include #include using namespace std;void multiply(const char* a, const char* b){ int i, j, ca, cb, *s; ca=strlen(a); cb=strlen(b); s=(int *)malloc(sizeof(int)*(ca+cb));原创 2012-09-17 16:10:54 · 972 阅读 · 2 评论 -
【2013年06月26日】趋势科技夏令营面试
中午10点钟进去的,面试官是个很和蔼的技术男,先说我简历上的自我评价怎么这么少的字,然后和我讨论了毕业论文,技术问题主要了以下几个:(1)堆和栈的区别;(2)进程和线程的区别,为什么要提出线程的概念;(3)TCP三次握手过程,为什么只要三次不要四次;(4)用过gdb没,linux下在一个文件中查找一个字符串的命令是什么;(5)TCP和UDP的区别,为什么有的程序要用UDP而不用原创 2013-06-26 21:24:25 · 2867 阅读 · 1 评论