数据结构与算法题集锦
OnlyQi
我是一只蜗牛
展开
-
将数组中的数字按出现次数排序打印
l= [0,1,2,0,2,2,1,1,4]dic = {}for v in l: # 统计每个数字出现的次数并存入dictionary,数字本身为key,出现的次数为value。 if v in dic: dic[v] = dic[v] + 1 else: dic[v] = 1l_new = [None] * len(l) # 生成一个listfor k,v in dic.items(): # 将dictionary中统计的数字放入lis...原创 2021-01-21 19:12:33 · 651 阅读 · 0 评论 -
找出数组中两个元素相加等于10的组合
1,O(N^2) 双重循环:def get_pair(input_list): # 简单双重循环,结果会有很多重复值。 for v1 in input_list: for v2 in input_list: if v1 + v2 == 10: print(v1, v2)l = [2,3,5,1,8,9,5,7,4,6,9]get_pair(l)--------------------------------原创 2021-01-18 12:29:26 · 3455 阅读 · 1 评论 -
用筛选法打印出1到100之间的所有质数
所谓筛选法是指从小到大筛选出一个已知质数的倍数。例如2是质数,那么它所有的倍数4,6...100都肯定不是质数。同样对于3也是。就这样依此类推,直到i增到到50为止(50的2倍等于100,因此后面的都不用计算了)。public class Testing { public static void main(String[] args) { int[] a = new原创 2013-01-23 23:38:53 · 3018 阅读 · 2 评论 -
找出字符串中重复最多的字母
已知一个字符串s=“iuoifdjfjehafp”,其中有重复字母。请找出其中重复次数最多的那个字母。这里用到了Compareable接口,非常方便。对于array,fruits实现该接口后,使用下句即可排序:Arrays.sort(fruits);对于实现了collection接口的集合类,比如ArrayList,fruits实现该接口后,使用下句排序:Col原创 2013-01-22 23:01:58 · 2768 阅读 · 1 评论 -
局部反转字符
将分隔符分隔的局部字符串反转。例如:#abcd#testing###nihao##"转换成[ #, d, c, b, a, #, g, n, i, t, s, e, t, #, #, #, o, a, h, i, n,##]分析:方法很多,比如用#分割字符串然后处理。但是最简单的还是如下例所示:遇到#就打印出来,遇到非#就push进一个stack。再次遇到#时,循环打印st原创 2012-09-19 22:18:58 · 716 阅读 · 0 评论 -
从m个字母中选择n个字母的所有选择,并打印
关于排列组合的数学知识,推荐阅读http://blog.csdn.net/onlyqi/article/details/8525280我们应该牢记排列组合的数学公式,以便检验代码的输出是否正确。在这里我把问题变化一下,可以得到3类问题:打印m个字母的所有排列方式。我们常称这种排列方式为全排列,然而在数学上,称为置换substitution。 public sta转载 2012-09-19 16:13:25 · 2726 阅读 · 0 评论 -
背包问题
背包问题是计算机科学里的经典问题,且有多种变种。其最简单的形式为,试图将不同重量的物体放到背包中.以使背包最后达到指定的总重量。不需要把所有的选项都放入背包中。举例来说,假设想要背包精确地承重20磅,并且有5个可以选择放入的物体,它们的重量依次为11磅、8磅、7磅、6磅和5磅。对于选择放入的数据项数量不大时,人类很善于通过观察,就可以解决这个问题。于是大概可以计算出只有8磅、7磅和5磅转载 2012-09-18 23:50:17 · 694 阅读 · 0 评论 -
图片顺时针转动问题
下面的代码将二维数组顺时针转动90度。package rotation;import java.util.Arrays;public class Testing{ static int[][] r = new int[4][4]; public static void main(String args[]){ int[][] c =原创 2012-09-18 22:12:04 · 830 阅读 · 0 评论 -
斐波那契数列问题
著名的Fibonnaci数列相关的问题经常在面试中遇到。要解决这种问题需要两步:1,确定遇到的问题是斐波那契数列。这是解决问题的关键点。斐波那契数列的特点是:数列的第一项为1,第二项为1,从数列的第3项开始,每一项都等于前两项之和:1,1,2,3,5,8,13,21....2,解决这个数列问题。下面用实例说明:问题一一个人上台阶,一次可以上一级台阶,也可以一次上两...原创 2012-09-12 14:39:40 · 2029 阅读 · 0 评论 -
最少硬币问题
给定一定面值的硬币 coins{1,3,5,10...n},求组成任意一个总数sum需要的最少硬币数量。例如,总数为sum,硬币为{1,3,5,7}.不过下面的代码在硬币为{3,5,7}时不能正常工作。因为本题的解法是,根据前一个状态计算下一个状态。如果coins是{3,5,7},则例如sum=6时无解,那么后面的状态也不能依赖这个状态了。public class Test原创 2012-05-03 14:27:01 · 954 阅读 · 0 评论 -
二叉树Binary Tree
树结合了另外两个数据结构的优点:有序数组和链表。树的查找和有序数组一样快,插入和删除和链表一样快。ps,有序链表的查找还是一样的慢。因为链表不能直接访问某个数据项。树相关的术语:路径根节点--节点通常是一个对象,它包含了数据,以及指向其他节点的引用。父节点子节点叶节点层子树访问遍历关键字--对象中常常会有一个数据域作为原创 2012-05-06 08:53:21 · 683 阅读 · 0 评论 -
B-tree在外部存储和数据库索引中的应用
B-tree在外部存储中的应用大家知道我们在使用数据结构时,常常将其直接放置到内存中。但是大数据量只能放到磁盘中。这里要说的就是,在磁盘存储中,文件系统是如何利用B-tree结构来提高磁盘读取效率的。首先来说一下内存和磁盘性能上的巨大差别。大家知道数据在磁盘上存储在特定的扇区。因此要读写特定的数据,需要三步:1,首先磁头必须移动到正确的磁道上。2,然后需要等待磁片旋转,使磁原创 2012-08-25 22:51:06 · 3121 阅读 · 0 评论 -
P和NP问题
如果一个算法的运行时间上限为一个多项式表达式(例如T(n) = O(nk),其中k为常量),则称该算法为“多项式时间算法”(polynomial time)。上例中我们也可以称这种算法的复杂度为O(nk)。可以用这种方法解决的问题是“快速问题”,简单的说需要比较短的时间就能完成,而不是几个世纪。可以由计算机在多项式时间内解决的问题的集合为P。NP表示一个更大的集合,他们的解可以在多原创 2013-03-11 11:12:21 · 1102 阅读 · 0 评论 -
如何买卖股票以获得最大收益 java算法
已知一段时间内股价有涨跌,例如 {3,6,1,4,7,3,8,8,3,5}.求最大获利是多少。不能买空卖空。例如,上例应该是第3天买,第7天卖获利最大,获利为7。其实最简单直接的思路还是双重for循环解法,只是效率较低,为O(n的平方):import java.util.Arrays;public class Main{ public static void main(...原创 2013-01-25 15:34:02 · 7236 阅读 · 0 评论 -
猴子吃桃子
猴子在第一天摘了若干个桃子,吃了一半后,不过瘾,又吃了一个。第二天又吃了剩下桃子的一半加1个。到第10天的时候,桃子还剩一个(第10天没有吃)。问猴子最开始摘了多少个桃子?这道题一看就是递归,且递推公式为:K(n-1)/2 -1 = K(n)但有意思的是结束条件是第10天而不是第1天,不符合一般递推应用”将复杂问题简单化“的理念。所以需要把题目转换一下:假设猴子第一原创 2013-01-29 20:59:56 · 1064 阅读 · 0 评论 -
如何估算算法的效率
估算算法的效率时的数学思想作为程序员,我们可以凭直觉得出一个算法的效率高低。但是在算法研究中,我们需要较为准确的数学概念来描述算法的效率。这里介绍一点相关的数学知识,非常非常的简单。仅考虑相对速度首先,当进行算法分析时,我们必须用抽象的方法,把问题简化。例如不考虑程序运行所在的机器效率问题等和环境相关的因素。因此我们在讨论两个算法效率高低时,考虑的是相对速度,而不是原创 2012-04-21 10:12:51 · 1777 阅读 · 0 评论 -
深度优先搜索 广度优先搜索
http://blog.csdn.net/sky156/article/details/2520568转载 2012-04-27 16:11:03 · 473 阅读 · 0 评论 -
哈希表
参考文章:http://en.wikipedia.org/wiki/Hash_function来看这样一个例子:我们有这样一个电话簿:人名 电话Emily 010-789987Smith 010-765443...这个表很大,我们希望有一种数据结构用于存储电话号码,并实现1,当我们想找到一个人(key)对应的电话号码时,需要花费的原创 2012-08-19 20:05:00 · 1690 阅读 · 0 评论 -
链表
链表的类型单链表,双端链表,有序链表,双向链表,有迭代器的链表(迭代器是用来随机访问链表元素的一种方法)。 单链表链表本身是由一个个的link对象构成的。每个link对象都包含两个部分:1,数据本身。2,指向下一个link对象的引用。因此链表就是很多的link对象,它们根据引用互相连接,形成了一个逻辑上的链表。而实际这些link对象在物理上并不一定是相邻的。转载 2012-05-01 23:06:52 · 648 阅读 · 0 评论 -
高级排序算法
归并排序 merge sort缺点是需要一个和原数组大小一样的数组空间。将一个数组分成两半,分别排序,然后将两个有序数组合并到一个有序数组中。递归比较两个有序数组的第一项,将较小的写入第三个数组中。希尔排序时间复杂度O(N*(logN)^2)基本有序后试用插入排序算法。间隔序列,书中只讨论了用公式h = h*3 + 1原创 2012-09-12 17:22:14 · 968 阅读 · 0 评论 -
基本排序算法
本文中的3中排序方法是最基本的,效率并不高。以后会提到其他效率较高的高级排序算法。冒泡BubbleSort例如给定如下数列:[1,3,2,8,12,6]比较第1个元素“1”和第2个元素“3”,“1”比“3”小,所以不做改变。接着比较第2个元素“3”和第3个元素“2”,“3”比“2”大,交换他们的位置:[1,2,3,8,12,6]接着比较第3个元素“3”和第4个元原创 2012-04-29 11:48:02 · 549 阅读 · 0 评论 -
Array和ArrayList
在写一些算法的小程序时,最常使用的就是数组了。数组的效率数组的大小是固定的。数组可以分为无序数组和有序数组。无序数组的插入很简单,就是在最后加入一个数据项,因此效率是常数O(1)。但是无序数组的查找很慢,需要遍历整个数组,因此效率是O(n).有序数组的插入很慢,需要先查找再插入。----------------------------------------------原创 2012-04-08 20:56:11 · 966 阅读 · 0 评论 -
Dynamic Programming
http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg转载 2012-08-22 16:56:48 · 818 阅读 · 0 评论 -
递归的应用
1, Hanoi塔问题Hanoi塔问题是,有A,B,C三根柱子,每根柱子都可以穿若干盘子。现在A柱上有4个盘子,从上到下越来越大。需要将全部盘子利用B作为中间移动到C柱上。规则是每次只能移动一个盘子,且盘子只能放到比自己大的盘子上。现在希望打印出移动的每一步的过程。要用递归解决这个问题,就要思考盘子在最后阶段处于的状态:1,想办法将n-1个盘子从A移动到B上,使用C为中间柱。2,将...原创 2012-05-05 10:47:35 · 737 阅读 · 0 评论 -
栈和队列
栈栈只允许访问一个数据项:最后插入的数据项。只有移除这个数据项后,才能访问倒数第二次插入的数据项。java有Stack类,实现List接口,同时继承了vactor父类,很方便。如果需要自己实现,则利用的数据结构就是数组array。但是用array实现的stack只是一个概念上的辅助工具,并不会在效率上带来多大的提高。出栈和入栈的时间复杂度都是常数O(1).转载 2012-05-01 09:36:43 · 735 阅读 · 0 评论 -
递归
递归相当于数球游戏:一个队人排成一排站好,每个人手里有几个球,球数不定。我站在队伍的最后,有一个人问题我:队伍里一共有多少球?我不知道总数,只知道自己手里有2个球。因此我去问倒数第二个herry,到他为止,前面的人一共有多少球。herry也不知道,只知道自己手里有3个球。于是他去问倒数第三个人mary,mary有1个球,她去问倒数第4个人。。。这样一直传递到队伍第一个人,他手里的球数,就能原创 2012-05-02 23:21:44 · 671 阅读 · 0 评论 -
常用数据结构
数据结构是指数据在计算机内存或磁盘中的组织形式。算法是完成特定任务的过程。对于每种数据结构,需要考虑:如何插入一条数据如何删除一条数据如何查找一条数据如何迭代的查找下一条数据常见数据结构和它们的效率:转载 2012-05-01 11:26:45 · 817 阅读 · 0 评论