
数据结构与算法
caoeryingzi
这个作者很懒,什么都没留下…
展开
-
josephus 问题
<br />josephus问题中,有以下扩展问题:<br /> <br />每隔M个删除一个,最后剩下一个;在algorithm I-IV中提到,用环状链表进行该操作。<br />#include <iostream.h>#include <stdlib.h>#include <stdio.h>struct node{ int item; node *next; node(int x, node *t) { item = x; next = t; }};原创 2010-11-26 11:39:00 · 521 阅读 · 1 评论 -
圆圈中最后剩下的数字
<br />程序员面试题精选(14)-圆圈中最后剩下的数字 <br />题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。<br />分析:既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数字的环形列表,然后每次从这个列表转载 2010-12-12 21:00:00 · 2243 阅读 · 0 评论 -
程序员面试题精选(10)-在排序数组中查找和为给定值的两个数字
程序员面试题精选(10)-在排序数组中查找和为给定值的两个数字题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n2)。我转载 2010-12-12 21:03:00 · 751 阅读 · 0 评论 -
求1+2+...+n(很多限制条件)
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止转载 2010-12-12 21:13:00 · 1015 阅读 · 0 评论 -
程序员面试题精选(06)-判断整数序列是不是二元查找树的后序遍历结果
<br />程序员面试题精选(06)-判断整数序列是不是二元查找树的后序遍历结果 <br />题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:<br /> 8<br /> / /<br /> 6 10<br /> / / / /<br /> 5 7 9 11<br />因此返回true。<br转载 2010-12-12 21:16:00 · 663 阅读 · 0 评论 -
程序员面试题精选(04)-在二元树中找出和为某一值的所有路径
<br />程序员面试题精选(04)-在二元树中找出和为某一值的所有路径<br />题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。<br />例如输入整数22和如下二元树<br /> 10<br /> / /<br />转载 2010-12-12 21:23:00 · 770 阅读 · 0 评论 -
程序员面试题精选(03)-求子数组的最大和
<br />程序员面试题精选(03)-求子数组的最大和<br />题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。<br />例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。<br />分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括google在内的很多知转载 2010-12-12 21:32:00 · 701 阅读 · 0 评论 -
数据结构小结
<br /><br />数据结构和算法到底有什么用?<br />数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排。数据结构包括数组、链表、栈、二叉树、哈希表等等。算法对这些结构中的数据进行各种处理。例如,查找一条特殊的数据项或对数据进行排序。<br />掌握这些知识以后可以解决哪些问题呢?<br />现实世界数据存储<br />程序员的工具<br />建模<br />数据结构的特性:<br />数组:优点是插入快,如果知道下标,可以非常快地存取。缺点是查找慢,删除慢,大小固定。<br />有序数组转载 2010-12-12 21:40:00 · 812 阅读 · 0 评论 -
单向链表的操作
<br />1.单向链表的创建<br /> <br />class Node{public: Node(int k=0,Node *n =0):key(k),next(n){} int key; Node *next;};void main(){ Node *listest= new Node; Node *head = new Node; listest->key = 1; listest->next = NULL; head->next = list原创 2010-12-16 14:38:00 · 667 阅读 · 0 评论 -
skip list
list的操作:查找,插入,删除。有序链表1.如何构建一个skip list?原创 2010-11-18 11:13:00 · 7032 阅读 · 0 评论 -
二叉查找树
<br />程序员面试题精选(11)-求二元查找树的镜像<br />题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入:<br /> 8<br /> / /<br /> 6 10<br />// //<br />5 7 9 11<br />输出:<br /> 8<br /> / /<br /> 10 6<br />//转载 2010-12-12 20:57:00 · 781 阅读 · 0 评论 -
翻转句子中单词的顺序
<br /><br />程序员面试题精选(07)-翻转句子中单词的顺序<br />题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。<br />例如输入“I am a student.”,则输出“student. a am I”。<br />分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。<br />由于本题需转载 2010-12-11 22:36:00 · 1936 阅读 · 0 评论 -
Josephus problem
<br />据说,因为Josephus的数学天赋,才使得其生存下来。<br /> <br /> <br />环状链表,各一个删一个,最后剩下哪一个元素?<br /> <br />在具体数学一书中谈到,如果有n个人,那么J(n)=2l+1;即最后剩下的是最开始是序号为2l+1的成员。<br /> <br />而其中,n=2^m+l;<br /> <br />书中有相关n分别为奇数和偶数时的证明。<br /> <br />那么在计算机中如何实现呢?涉及到2的幂时,可以联想到应用计算机移位操作,左移一位计算机乘以原创 2010-11-25 23:37:00 · 721 阅读 · 0 评论 -
分治法排序
<br />合并排序的关键步骤在于合并步骤中的合并两个已排序子序列MERGE(A,p,q,r)。假设子数组A[p..q]和A[q+1..r]均已经排好序,并将它们合并成一个已排好序的子数组代替当前子数组A[p..r]。<br /> <br />关键是两个子数组都是排好序的,这样的话,在合并时,比较时就比较简单了。因此,在分治法中,递归调用,然后合并。<br /> <br />自底向上进行排序,算法导论中将过程很好地呈现了。<br /> <br />留个记号,回头把程序补充上。原创 2010-12-04 21:26:00 · 591 阅读 · 0 评论 -
sizeof
计算机中信息的存储单位(1)位(Bit):表示一个二进制数码0或1,是计算机存储处理信息的最基本的单位。(2)字节(Byte):一个字节由8个位组成。它表示作为一个完整处理单位的8个二进制数码。现目前计算机上多使用《美国国家信息交换标准代码》——ASCII编码(由美国国家标准委员会制定)如:字符“A”的二进制编码是“0100 0001”即41H或65D “#”的二进制编码是“0010 0011”即23H或35D(3)字(Word):16个位为一个字,它代表计算机处理指令或数据的二进制数位数,是计算原创 2010-12-03 17:29:00 · 714 阅读 · 1 评论 -
第一个只出现一次的字符
这个是很老的题目了。字符串,第一个只出现一次的字符。思路是,26个字母,小写的,统计每一个字符出现的次数,现在大多数都是只有小写的。不知道为何,没有人统计大写的字符呢?小写字母的ASCII大32位,为何没有这么处理呢?但是在,总体来说,这个题目其实不算难,只要首先扫描统计一下就行了。然后再追个扫描一下,看看该字母的次数是否为1。转载 2010-12-11 22:10:00 · 492 阅读 · 0 评论 -
程序员面试题精选(01)-把二元查找树转变成排序的双向链表
<br /><br />题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。<br /> 比如将二元查找树<br /> 10<br /> / /<br /> 6 14<br />转载 2010-12-11 22:47:00 · 654 阅读 · 0 评论 -
程序员面试题精选(09)-查找链表中倒数第k个结点
程序员面试题精选(09)-查找链表中倒数第k个结点题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。既然不能从尾结点开始遍历这个链表,我们还是把思路回到头转载 2010-12-12 21:07:00 · 731 阅读 · 0 评论 -
查找最小的k个元素
<br /><br />题目:输入n个整数,输出其中最小的k个。<br />例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。<br />分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。<br />我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,则将读入的整数直接放到数组中。否则长度为k的数组已经满了,不能再转载 2010-12-12 21:18:00 · 2799 阅读 · 0 评论 -
程序员面试题精选(02)-设计包含min函数的栈
<br />程序员面试题精选(02)-设计包含min函数的栈<br />题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 分析:这是去年google的一道面试题。<br />我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。<br />在栈里添加一个成员变量存放最小元素(或最小元素的位置转载 2010-12-12 21:33:00 · 760 阅读 · 0 评论 -
数据结构的使用和学习
<br />大概翻看了一半的算法导论,虽然看的过程中没有做习题,但是每章都是看懂了才进行下一章的。初步打算是,首先将每章的知识结构有了解了,各个部分的内容有个大概掌握了再回头细看。<br /> <br />从笔试等的题目来看,这本书是非常有用的,只是想都吸收,是有难度的。<br /> <br />加油,这本算法导论要好好看,看完第一遍后,第二遍好好实现一下书中的伪代码和每章的习题。原创 2010-12-12 21:49:00 · 659 阅读 · 0 评论 -
sort
昨天下午听了公司内部的一个小讲座,哈哈,虽然自己也看过数据结构,可是平时吧,用的不多。记得前一段时间写代码时,开始想着要用到排序,可是后来发现我要的数据已经按照我想要的顺序排列了,我也就不用写排序算法了。讲座中是无法把数据结构弄明白的,不过我觉得值得一提的是wiki上对sort的介绍,都是有动画的,而且还有comparison,很nice.merge sort 用的地方不少吧,尤原创 2012-08-04 16:20:39 · 459 阅读 · 0 评论