算法数据结构
文章平均质量分 63
terry84fun
这个作者很懒,什么都没留下…
展开
-
第一题:约瑟夫环问题
问题: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列; 他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 解题代码如下:public class YueSeHu { private int n; private int m; private int[] man原创 2009-10-31 10:40:00 · 649 阅读 · 0 评论 -
寻找丑数
2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。题目:我们把只包含因子 习惯上我们把1当做是第一个丑数。解题思路: (1)根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数。里面的每一个丑数是前面的丑数乘以2、3或者5得到的。(2)这原创 2009-11-19 14:20:00 · 598 阅读 · 0 评论 -
在字符串中删除特定的字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。解题思路:(1)我们并不需要在每次删除一个字符的时候都去移动后面所有的字符。我们可以设想,当一个字符需要被删除的时候,我们把它所占的位置让它后面的字符来填补,也就相当于这个字符被删除了原创 2009-11-19 15:20:00 · 840 阅读 · 0 评论 -
判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / / 6 10 / / / / 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历原创 2009-11-20 10:54:00 · 435 阅读 · 0 评论 -
第一个只出现一次的字符-hash解法
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。解题思路:由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?要达到这个目的,我们需要一个数据容器来存放每个字符的出现次数。在这个数据容器中可以根据字符来查找它出现的次数,也就是说这个容器的作用是把一个字符映射成一个数字。在常用的数据容器中,哈希表正是这个用途。哈希原创 2009-11-19 14:48:00 · 654 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径-递归算法
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / /原创 2009-11-20 10:03:00 · 616 阅读 · 0 评论 -
在排序数组中查找和为给定值的两个数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。解题思路:最初我们找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时,把较大的数字往前移动;当两个原创 2009-11-20 14:12:00 · 1011 阅读 · 0 评论 -
快速找到两个有序数组第(m+n)/2个元素
题目:两个数组,分别按从小到大排列第一个数组,m个元素第二个数组,n个元素如何快速找到第(m+n)/2个元素?能否在O(lg(m+n))的时间复杂度内完成? 解题思路:如果A[m/2] 如果 > ,在A的前半段和B的后半段继续2分查找如果 =,返回原创 2009-11-21 23:23:00 · 643 阅读 · 0 评论 -
和为n连续正数序列
题目:题目:输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 解题思路:我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于n的话,我们向右移动small,相当于从序列中去掉较小的数字。原创 2009-12-09 15:09:00 · 947 阅读 · 0 评论 -
找出数组中两个只出现一次的数字--分组异或
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解题思路:这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现依次的数原创 2009-11-19 15:49:00 · 1854 阅读 · 2 评论 -
求两个有序数组相同元素的个数-JAVA
/** * @param args *求两个有序数组相同元素的个数 */ public static int commonLength(int[] a,int[] b) { int lenA=a.length; int lenB=b.length; int i=0,j=0; int count=0; while(i { if(a[i]==b原创 2009-11-13 15:15:00 · 1462 阅读 · 0 评论 -
第一题:排列组合问题
问题:/* * 排列组合问题 * (1)求一个集合所有子集的问题 * (3)求一个集合的全排列 * (2)求从一个含有n个元素的集合中取m个元素的组合 * * /public class PermutationCombination { /** * @param args */ private int total = 0; private Array原创 2009-11-02 10:10:00 · 452 阅读 · 0 评论 -
打印螺旋举矩阵-java
package algorithms;public class RingDemo { /** * @param args * 打印螺旋举矩阵 */ public static void setArray(int n) { int intA = 1;//初始化 int[][] array = new int[n][n]; int int原创 2009-11-13 15:17:00 · 732 阅读 · 0 评论 -
字符串反转-java
/**将一个字符串反转:Hello world --> world Hello**/ //对一个char数组进行整体反转 public static void subReverse(char[] str, Integer begin, Integer end) { char temp; while (begin temp = str[begin];原创 2009-11-13 15:22:00 · 505 阅读 · 0 评论 -
数组中最长递增子序列-java
求数组中最长递增子序列写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度。例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列为1,2,4,6。 分析与解法 根据题目的要求,求一维数组中的最长递增子序列,也就是找一个标号的序列b[0],b[1],…,b[m](0 解法一原创 2009-11-13 15:38:00 · 8742 阅读 · 0 评论 -
编辑距离算法-java
public class LDistance { // **************************** // Get minimum of three values // **************************** private int Minimum(int a, int b, int c) { int mi; mi = a; if原创 2009-11-13 15:09:00 · 1119 阅读 · 1 评论 -
比一个整数大的最小的质数-java
/***比一个整数大的最小的质数***/ public static int getMiniPrim(int n) { n++; int half=(int)Math.sqrt(n); int i = 2; for(;i { if(n%i==0) return getMiniPrim(n++); } return n; }原创 2009-11-13 15:26:00 · 647 阅读 · 0 评论 -
二叉排序树的建立-java
class Tree { Tree left, right; int item; public Tree(Tree left, Tree right, int item) { this.left = left; this.right = right; this.item = item; }}public class BinSearchTree原创 2009-11-13 15:28:00 · 1742 阅读 · 1 评论 -
两字符序列的最长公共字符子序列
求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB”,Y=“BCDB”是原创 2009-11-13 15:58:00 · 1476 阅读 · 0 评论 -
旋转数组的最大小元素
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 解题思路分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我原创 2009-12-09 16:09:00 · 715 阅读 · 0 评论