摘要: 1. 题目:给定一个有小写字母组成的字符串,重组这个字符串,使相同字符之间的间隔至少为d。 Input:{a,b,b}, distance=2 output:{b,a,b}。2. 个人认为这道题目很有难度。初看时不知如何下手。结合文章中给出的算法,具体算法如下:主体的算法思想是“贪心算法”。出现次数最多的字符被选中放入新字符串的优先级最高,如果这个字符不能被选中(因为距离的限制,比如上次选择了字符a,这次选择如果仍然a出现次数最多,但是却不能选a,因为如果要求距离为2,再次选择a,造成两个a相邻,那距离就为1了),那么我们选择下一个优先级最高的字符(并且这个字符的出现也要满足距离的要求,如.. 阅读全文
posted @ 2012-08-12 16:57 kasuosuo 阅读(910) 评论(0) 推荐(0) 编辑
摘要: 产生死锁的根本原因:资源有限且操作不当。 死锁的四个必要条件互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源(局部资源分配条件)。非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。处理死锁的策略1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能 阅读全文
posted @ 2012-08-11 09:53 kasuosuo 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:给定一个数组求出和为0的所有三元组,要求去除重复的情况,如[-1,0,1]和[0,-1,1]是相同的情况。2. 分析:有一道经典题目是:给定一个有序数组,求出和为0的所有二元组。这道题目通过两个指针,一个从前向后走,一个从后向前走。最终的时间复杂度为O(n)。本题是这道题目的变形或者说引申。最原始的算法:三重for循环,找出所有情况,时间复杂度为O(n^3)。不过,根据上面那道题目可以得到一个时间复杂度为O(n^2)的算法。要求a+b+c=0,可以变成a+b=-c这种形式,外循环遍历一次数组,相当于固定c,内循环判断a+b是否等于-c。3. 代码:View Code 1 #inc. 阅读全文
posted @ 2012-08-10 15:58 kasuosuo 阅读(1588) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:给定一个旋转的有序数组,比如{7,8,9,10,1,2,3}是{1,2,3,7,8,9,10}旋转之后得到的,在数组中查找是否存在元素key。要求时间复杂度为O(lgn)。假定数组中不存在重复元素。2. 分析:从上面的选择数组可以发现,array[middle]将数组分成两段,两段中必有一段是有序的。这样就可以使用二分查找了。一个变形的二分查找。3. 代码:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 int rotateBinarySear 阅读全文
posted @ 2012-08-10 14:52 kasuosuo 阅读(1278) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:使用putchar(不能使用sprintf,itoa等)输出一个long整型数。2. 分析:两种方法:(1)迭代输出 (2)递归输出3. 代码:View Code 1 //递归算法 2 void putlong(unsigned long n) 3 { 4 if (n < 10) 5 { 6 putchar(n+'0'); 7 return ; 8 } 9 putlong(n / 10); 10 putchar(n % 10 + '0'); 11 } 12 13 14 //迭代算法15 vo... 阅读全文
posted @ 2012-08-10 10:25 kasuosuo 阅读(446) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:给定一个字符串,单词以' '或'\t'间隔,返回字符串中的单词个数。如输入:"\t ab\tc drf e ffrt\tert",输出为6。2. 解答: (1)我的思路:遍历字符串,遇到非' '或'\t',则count++,然后while循环跳过之后的所有非' '或'\t';如果是' '或'\t',然后while循环跳过所有的' '或'\t'。这样每次遇到非' '或'\t' 阅读全文
posted @ 2012-08-09 16:55 kasuosuo 阅读(533) 评论(0) 推荐(0) 编辑
摘要: 1. 使用C代码去除字符串中的空格,void removeSpace(char* str)2. 解析: (1)主要考察C编程功底 (2)需要注意的问题:代码书写方式,整洁书写代码。 (3)虽然是一道简单的题目,但是很考察基础能力。3. 代码:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 //这中编码方式存在错误 7 void removeSpace1(char *str) { 8 char *p1 = str, *p2 = str; 9 cout... 阅读全文
posted @ 2012-08-09 16:00 kasuosuo 阅读(948) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:如何判断一个点在三角形内部?2. 解析: (1)方法1:面积法,如下面两幅图所示,图(a)点O在ABC外侧,面积S(ABO)+S(ACO)+S(BCO)>S(ABC);图(b)点O在ABC内部,S(ABO)+S(ACO)+S(BCO)=S(ABC)。由此可以使用面积法来判断点是否在三角形内侧。 (2)方法2:三角形的边做逆时针标准,如下图。如果点在三角形内,则点必然在射线AB,BC,CA的左侧;如果点在三角形外,则点必在某条射线的右侧。 (3)方法3:从点O水平向左作一条射线,并计算与三角形各条边是否相交。如果相交的边数为奇数,则点在三角形内部;如果相... 阅读全文
posted @ 2012-08-09 10:37 kasuosuo 阅读(1439) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:找出两个有序数组的交集。2. 解析:给定数组a和b,a的长度为m,b的长度为n (1)最原始的方法,依次遍历a中每一个元素,并通过遍历b来判断a中元素是否在b中。时间复杂度O(m×n) (2)改进的算法,在b中查找a的元素改为二分查找,时间复杂度为O(mlgn) (3)因为a和b都是有序的,遍历a和b,并对a和b中的元素进行判断,如果a[i]<b[j] i++, 如果a[i]>b[j] j++, 如果a[i]==b[j] i++, j++。时间复杂度为O(m+n)3. 分析: (1)当m很小,n很大时,O(mlgn)二分法查找的效率高于线性查找的O(m+n), 阅读全文
posted @ 2012-08-09 09:58 kasuosuo 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 1. 代码如下:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 struct Node 7 { 8 Node* m_next; 9 int m_data; 10 Node(int data=0,Node* next=NULL) 11 { 12 this->m_data=data; 13 this->m_next=next; 14 } 15 }; 16 17 Node* Create... 阅读全文
posted @ 2012-08-08 20:14 kasuosuo 阅读(410) 评论(0) 推荐(0) 编辑