数据结构与算法
文章平均质量分 66
xufei96
SDET .net C#
展开
-
第6章 图
6.4.3 拓扑排序在AOV网中,不应该出现有向环路,因为有环意味着某项活动以自己作为先决条件,这样就进入了死循环。检测的办法是对有向图进行拓扑排序(Topological Sort),若网中所有顶点都在它的拓扑有序序列中,则AOV网中必定不存在环。下面是拓扑排序算法的描述:(1)在有向图中选择一个入度为0的顶点(即没有前驱的顶点),由于该顶点没有任何先决条件,输出该顶点;原创 2013-09-17 14:23:15 · 558 阅读 · 0 评论 -
求二叉树中节点的最大距离...
求二叉树中节点的最大距离...如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。 计算一个二叉树的最大距离有两个情况:情况A:原创 2010-11-02 13:09:00 · 688 阅读 · 0 评论 -
3.求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10,原创 2010-11-01 15:10:00 · 348 阅读 · 0 评论 -
abcde五人打渔,打完睡觉,a先醒来,扔掉1条鱼,把剩下的分成5分,拿一份走了;b再醒来,也扔掉1条,把剩下的分成5份,拿一份走了;然后cde都按上面的方法取鱼。问他们一共打了多少条鱼,写程序和算法
创新工场面试题:abcde五人打渔,打完睡觉,a先醒来,扔掉1条鱼,把剩下的分成5分,拿一份走了;b再醒来,也扔掉1条,把剩下的分成5份,拿一份走了;然后cde都按上面的方法取鱼。问他们一共打了多少条鱼,写程序和算法实现。提示:共打了多少条鱼的结果有很多。但求最少打的鱼的结果是3原创 2011-09-23 17:29:18 · 1433 阅读 · 0 评论 -
求N!的二进制表示中最低位1的位置
rt,由于N!中含有质因数2的个数,等于[N/2]+[N/4]+[N/8]+...,根据以上分析,得到具体算法: using System; namespace ConsoleApp{ class Program { st原创 2011-08-10 17:34:29 · 740 阅读 · 0 评论 -
求二进制数中1的个数
对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数。 C# codes as below: using System; namespace CountConsoleApp{ class Program {原创 2011-08-08 17:38:47 · 413 阅读 · 0 评论 -
有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC
rt, C# codes as below: using System;using System.Threading; namespace MConsoleApp{ class Program { static voi原创 2011-08-03 11:06:31 · 854 阅读 · 0 评论 -
三层四层二叉树有多少种
rt, 三层四层二叉树有多少种,延伸下就是问题:二叉树不同层数的有多少种? 0层的二叉树有1种;a0 = 1; 一层的二叉树有1种;a1 = 1; 二层的二叉树有3种;a2 = 2*(a0*a1)+a1*a1 = 3;三层的二叉树有2*(a0*a2原创 2011-08-03 11:03:18 · 1565 阅读 · 0 评论 -
某种传染病第一天只有一个患者,前五天为潜伏期,不发作也不会传染人;第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人;求第N天共有多少患者
某种传染病第一天只有一个患者,前五天为潜伏期,不发作也不会传染人第6天开始发作,从发作到治愈需要5天时间,期间每天传染3个人求第N天共有多少患者 C# codes as below: using System; namespace ConsoleApp{ class Program { static void Main(str原创 2011-06-10 12:59:00 · 1531 阅读 · 0 评论 -
1.把二元查找树转变成排序的双向链表
<br />1.把二元查找树转变成排序的双向链表<br /> 题目:<br />输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。<br />要求不能创建任何新的结点,只调整指针的指向。<br /> <br /> 10<br /> / /<br /> 6 14<br /> / / / /<br />4 8 12 16<br /> <br /> 转换成双向链表<br />4=6=8=10=12=14=16。<br /> <br /> 首先我们定义的二元查找树 节点的数据结构如下原创 2010-11-24 16:15:00 · 398 阅读 · 0 评论 -
2. 100个人排队上飞机,飞机上有100个座位,每个人对应一个座位,队首的人是个瞎子,上飞机后随便坐,后面的人都尽量找自己的座位,如果已经被占,则随机做,问第100个人坐到自己座位的概率
1. 猫和老鼠玩象棋,玩了M+N局,猫赢了M局 老鼠赢了N局 N>M,而且在整个过程中,猫的得分从来没有超过过老鼠,问共有多少种可能的比赛得分过程卡特兰数,另写一程序计算,ModuleModule1 Sub Main() Console.WriteLine(Count(7, 7)) Console.ReadKey() EndSub PublicFunction Count(ByVal totalPersons AsInteger, ByVal targetPer原创 2010-11-17 16:15:00 · 2916 阅读 · 0 评论 -
猫和老鼠玩象棋,玩了M+N局,猫赢了M局 老鼠赢了N局 N>M,而且在整个过程中,猫的得分从来没有超过过老鼠,问共有多少种可能的比赛得分过程
<br />1. 猫和老鼠玩象棋,玩了M+N局,猫赢了M局 老鼠赢了N局 N>M,而且在整个过程中,猫的得分从来没有超过过老鼠,问共有多少种可能的比赛得分过程<br /> <br />2. 每日早上淘宝网办公楼对面的烧饼店都有人排长队买烧饼,假设每个烧饼5元,有16个人排队,其中有8个人只有5元的钞票,另外8个人只有10¥的钞票,每个人只买一个烧饼。假设开始时店老板没有任何钞票,问这16个人有多少种排队方式,不至于使店老板找不开钱???<br /> <br />same question, VB.NET c原创 2010-11-11 14:49:00 · 2711 阅读 · 1 评论 -
引用类型参数与引用参数的区别
<br /> 引用类型参数与引用参数的区别<br /> <br /> <br />namespace ConsoleApp<br />{<br /> classClass1<br /> {<br /> staticvoid Main(string[] args)<br /> {<br /> Class1 c1 = newClass1(444);<br /> c1.M2(c1);<br /> System原创 2011-01-05 10:04:00 · 382 阅读 · 0 评论 -
假设已经有了前序遍历和中序遍历的结果,通过一个算法重建这棵树
rt, 分析与解法前序: a b c d e f后序: d b a e c f“a”是前序遍历节点的第一个元素,它把中序遍历的结果分为“db”和“ecf”两个部分,这两部分也是“a”的左右子树的遍历结果。如果能够找到前序遍历中对应的左子树和右子树,就可以原创 2011-08-29 10:31:12 · 381 阅读 · 0 评论 -
把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N)
分析与解法假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位,比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换过程通过以下步骤完成:1.逆序排列原创 2011-08-29 15:15:23 · 2696 阅读 · 1 评论 -
给定一个长度为N的整数数组,计算任意(N-1)个数的组合中乘积最大的一组,算法的时间复杂度为O(N)
分析与解法遍历一遍数组,求出数组中正数(+),负数(-)和0的个数,从而判断N个数乘积的正负性,依此判断是去掉0,还是最小的负数,还是最大的负数,还是最小的正数来得到目标的N-1个数,使乘积最大。例如:集合全为负数时,去掉最小负数;全为正数时去掉最小正数;等等还有很多种情原创 2011-08-29 16:24:54 · 1427 阅读 · 0 评论 -
第6章 图
6.4.2 最短路径2. 狄克斯特拉(Dikastra)算法对于求单源点的最短路径问题,狄克斯特拉(Dikastra)提出了一个按路径长度递增的顺序逐步产生最短路径的构造算法。狄克斯特拉的算法思想是:设置两个顶点的集合S和T,集合S中存放已找到最短路径的顶点,集合T中存放当前还未找到最短路径的顶点。初始状态时,集合S中只包含源点,设为v0,然后从集合T中选择到源点v0路径长度最短的顶点u加原创 2013-09-17 13:40:39 · 670 阅读 · 0 评论 -
第6章 图
6.4 图的应用6.4.1 最小生成树1, 最小生成树的基本概念如果是一个无向连通图,那么它的所有生成树中有一棵边的权值总和最小的生成树,我们称这棵生成树为最小代价生成树,简称最小生成树。2,普里姆算法(Prim)假设G=(V,E)为一无向连通图,其中V为网中顶点的集合,E为网中边的集合。设置两个新的集合U和T,其中,U为G的最小生成树的顶点的集合,T为G的最小生成树的边的集合原创 2013-09-16 16:28:42 · 648 阅读 · 0 评论 -
第6章 图
3. 克鲁斯卡尔(Kruskal) 算法 克鲁斯卡尔算法的基本思想是:对一个有n个顶点的无向连通图,将图中的边按权值大小依次选取,若选取的边使生成树不形成回路,则把它加入到树中;若形成回路,则将它舍弃。如此进行下去,直到树中包含有n-1条边为止。(当整个图为连通图时为n-1条边) 根据邻接矩阵存储结构实现Kruskal算法:(邻接链表的实现在前面的博客) public原创 2013-09-16 16:40:16 · 611 阅读 · 0 评论 -
第6章 图
6.3 图的遍历6.3.1 深度优先遍历以下图为例,其深度优先遍历输出应该为:1 -> 3 -> 2 -> 5 -> 4 -> 6 -> 7 -> 9 -> 8 -〉10图的深度优先遍历类似于树的先序遍历,是树的先序遍历的推广。要借助一个辅助数组标记已经遍历过的顶点。以邻接表为例实现图的深度优先遍历:GraphAdjList类的定义在上一篇图的邻接表存储结构博客中原创 2013-09-05 14:58:14 · 566 阅读 · 0 评论 -
二分查找与三分查找算法 C#
首先是二分查找法,时间复杂度O(2log2(n)): static bool Find(int[] sortedArray, int number) { if (sortedArray.Length == 0) return false; int start = 0;原创 2010-05-24 23:35:00 · 3970 阅读 · 6 评论 -
第6章 图
6.2.2 邻接表邻接表(Adjacency List)是图的一种顺序存储与链式存储相结合的存储结构,类似于与树的孩子链表表示法。顺序存储指的是图中的顶点信息用一个顶点数组来存储,一个顶点数组元素是一个顶点结点,顶点节点有两个域,一个是数据域,存放与结点相关的信息,一个是引用域firstAdj。顶点的邻接表示把所有邻接于某顶点的顶点构成一个表,它是采用链式存储结构。所以,我们说邻接表是图的一种原创 2013-09-05 11:06:16 · 743 阅读 · 0 评论 -
第6章 图
6.1.3 图的基本操作 //Graph node class public class GraphNode { public T Value { get; set; } public GraphNode(T value) { Value = value; } }原创 2013-09-04 14:48:11 · 638 阅读 · 0 评论 -
第6章 图
第6章 图6.1 图的基本概念6.1.1 图的定义图是由非空的顶点集合和描述顶点之间的关系——边或弧的集合组成。6.1.2 图基本术语无向图 有向图 边 弧 弧头 弧尾 无向完全图 有向完全图 顶点的度 入度 出度 权 网 子图 路径 路径长度 的示例: 简单路径,回路,简单回路,连通,连通图连通分量强连通图,强连通分量生成树:连通图G的生成原创 2013-09-03 16:11:11 · 601 阅读 · 0 评论 -
求0-2000内的所有质数(筛选法)
核心算法:我们先设保存整数0~N的数组为sieve[N+1],设素数P(2若比素数P小的所有素数的倍数均已从sieve中删去,则比素数P大的非素数的所有因子均比P大。Code://Func.h#include "stdafx.h"#include using std::cout;using std::endl;void PrintNums(int num){原创 2012-01-20 10:10:28 · 979 阅读 · 1 评论 -
一道腾讯的面试题:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。rt,思想:随机生成小于7的数,奇偶均为1/2. 随机生成1-5,之前为偶则+5输出,否则直接输出。using System;namespace RandomApp{ class Program { static void Main()原创 2011-10-09 11:00:33 · 1667 阅读 · 2 评论 -
火车运煤问题
你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?rt原创 2011-10-09 10:23:53 · 645 阅读 · 0 评论 -
诚实村与谎言村
一天,你跟随渔夫出海打鱼,在海上遇到了大风浪而迷失了方向,小船被刮到了一座小岛上。岛上有两个相邻的村子,一个叫诚实村,一个叫谎言村,诚实村的村民只会说真话,从不撒谎,而谎言村的村民则只说谎话,从不说真话。所以你决定想办法区分出这不同的两组人,弄清楚谁说的是真话,这样才能够找到回去原创 2011-10-13 13:51:39 · 3480 阅读 · 0 评论 -
54.调整数组顺序使奇数位于偶数前面。
<br />题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,<br />所有偶数位于数组的后半部分。要求时间复杂度为O(n)。<br /> <br />VB.NET codes as below:<br /> <br />ModuleMyModule<br /> <br /> Sub Main()<br /> Dim array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 9, 8, 7, 6, 5, 4, 3, 2, 2}<br原创 2010-11-09 16:24:00 · 409 阅读 · 0 评论 -
输入一个正数n,输出所有和为n连续正数序列
<br />51.和为n连续正数序列。<br />题目:输入一个正数n,输出所有和为n连续正数序列。<br />例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。<br />分析:这是网易的一道面试题。<br /> <br />VB.NET codes as below:<br /> <br />ModuleMyModule<br /> <br /> Sub Main()<br /> Print(15)<br /> <br />原创 2010-11-09 16:06:00 · 663 阅读 · 0 评论 -
一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
<br />2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值<br /> 比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; <br /> {3,6}{2,4,3} m=2<br /> {3,3}{2,4}{6} m=3 所以m的最大值为3<br /><br /> <br />C# codes as below:<br /> <br />using System;<br />using System.Collections.Generic;<br /> <br原创 2010-11-08 17:10:00 · 2307 阅读 · 0 评论 -
给出一个数组,一个数字,输出数组中所有两个元素相加正好等于该数字的组合,不能有重复。
<br />c# codes as below:<br /> <br />using System;<br /> <br />namespace MyApp<br />{<br /> classProgram<br /> {<br /> staticvoid Main()<br /> {<br /> int[] arr1 = { -1, -2, 3, 4, -5, 6, 7, 8, 9, 4,4,4,4,4,4,4,4,4,4,10000,1,1原创 2010-08-09 22:23:00 · 1563 阅读 · 0 评论 -
写一个函数,要求对一个整数数组重新排序,使奇数总是在偶数的前面位置
<br />C# codes as blow:<br /> <br /> static int[] Method(int[] array)<br /> {<br /> while(array==null || array.Length==0)<br /> return array;<br /> int i=0;<br /> int j=array.Length-1;<br />原创 2010-06-10 19:14:00 · 806 阅读 · 0 评论 -
给定一个数,求出不大于该数的最大的2的幂,例:17->16,256->256;
<br />C# codes as below:<br /> <br /> static int GetNum(int value)<br /> {<br /> if (value == 0)<br /> return 0;<br /> int max=32;<br /> int min = 0;<br /> int actual=0;<br />原创 2010-06-11 14:38:00 · 362 阅读 · 0 评论 -
设计一个队列,实现GetMin()函数
<br />C# codes as below:<br /> <br /> class Queue <br /> {<br /> private int min;<br /> public int GetMin()<br /> {<br /> return min;<br /> }<br /> Stack<int> container = new Stack<int>();<br /> St原创 2010-06-11 13:45:00 · 470 阅读 · 0 评论 -
写入一个字符串,输出该字符串的所有排列组合。
C# code as below: class Program { static void Main(string[] args) { Method("123"); Console.ReadKey(); } static void Method(string str,string str2="") { if (str == null)原创 2010-06-10 21:53:00 · 1432 阅读 · 0 评论 -
将两个有序链表合并成一个有序链表
<br />C# codes as below:<br /> <br />class Link <br /> {<br /> public Node FirstNode{get;set;}<br /> public static Link MergeSortedLink(Link firstLink, Link secondLink)<br /> {<br /> Node currentNode1 = firstLink.FirstNod原创 2010-06-04 13:10:00 · 576 阅读 · 0 评论 -
设计一个Integer整数类,并使Integer i=8; 语句编译不出错
..原创 2010-07-21 10:29:00 · 423 阅读 · 0 评论 -
数据结构排序大全(C#)
排序大全1.稳定性比较 插入排序、冒泡排序、二叉树排序、归并排序及其他线形排序是稳定的 选择排序、希尔排序、快速排序、堆排序是不稳定的2.时间复杂性比较 插入排序、冒泡排序、选择排序的时间复杂性为O(n2) 其它非线形排序的时间复杂性为O(nlog2n) 线形排序的时间复杂性为O(n);3.辅助空间的比较归并排序的辅助空间为O(n),其它排序的辅助空间为O(1)原创 2010-05-26 23:51:00 · 1512 阅读 · 0 评论 -
编写算法将二叉树中所有结点的左、右子树相互交换
递归,C# codes如下: class TreeNode { public TreeNode LeftSon { get; set; } public TreeNode RightSon { get; set; } public string Value { get; set; } publi原创 2010-03-15 13:45:00 · 2191 阅读 · 0 评论