- 博客(55)
- 收藏
- 关注
转载 string相关函数的实现
1. strstr函数:char* strstr(const char* src,const char* dest),返回子串dest第一次在src中出现的位置。 1 char* mystrstr(const char* src,const char* des) 2 { 3 assert(src && des); 4 int n=0;...
2012-09-17 10:44:00
144
转载 最大子段和扩展(二维)
1. 题目:参见编程之美P189页。2. 分析:详细算法书上说的很明确,学会这个分析过程。具体代码如下: 1 //二维最大子段和问题 2 int maxSum(int **a,int row,int col, 3 int& i_min,int& j_min,int& i_max,int& j_max)...
2012-09-14 16:37:00
260
转载 棋盘覆盖问题
1. 题目:参见《计算机算法设计与分析》P192. 分析:当k>0时,将2k×2k的棋盘分成4个2k-1×2k-1的子棋盘。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,我们可以用一个L型骨牌覆盖这3个较小棋盘的汇合处,这3个子棋盘上被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将问题转化为4个较小规模的棋盘覆盖...
2012-09-04 16:59:00
139
转载 循环赛日程表
1. 题目:设有2k 个运动员参加循环比赛,要求如下: (1)每个选手必须与其他选手各赛一次 (2)每个选手一天只能赛一次 (3)比赛进行n-1天2. 分析:题目来自《计算机算法设计与分析》 P34页。书中有具体的分析,是采用分治算法来安排的赛程表。代码如下: 1 int a[100][100]={0}; 2 3 void table(int k,...
2012-09-04 16:27:00
136
转载 错排问题
方法一:n各有序的元素应有n!种不同的排列。如若一个排列式的所有的元素都不在原来的位置上,则称这个排列为错排。任给一个n,求出1,2,……,n的错排个数Dn共有多少个。递归关系式为:D(n)=(n-1)(D(n-1)+D(n-2))D(1)=0,D(2)=1可以得到:错排公式为f(n) = n![1-1/1!+1/2!-1/3!+……+(-1)^n*1/n!]其中,n!=1*2*3*...
2012-09-04 15:08:00
72
转载 求一个数组中第k小的数
1. 题目:给定一个无序整数数组,返回这个数组中第k小的数。2. 分析:最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1)。使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n)。 具体的思路:将数组按照第一个数字first进行划分,将比first小的放在左...
2012-09-01 09:57:00
216
转载 字典树(TrieTree)
1. 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。2. Trie Tree的性质: (1)根节点不包含字符,除根节点外每一个节点包含一个字符。 ...
2012-08-31 13:46:00
162
转载 将给定的字符数组转换成float类型
1. 这道题主要是要将几种情况考虑完整,一下给出的程序考虑以下几种情况:(1)以'+'开始的字符串(2)以‘-’开始的字符串(3)出现多个点‘.’的字符串(4)出现非法字符(5)不合理的组合方式2. 代码如下: 1 bool flag=true; 2 float ctof(const char* str) 3 { 4 assert(st...
2012-08-30 15:33:00
507
转载 gdb调试
1. linux下编译C程序使用cc gcc g++ 编译C++程序使用 g++。2. 调试程序使用gdb。3. 调试过程主要参考以下两篇文章:http://blog.csdn.net/haoel/article/details/2879http://blog.csdn.net/haoel/article/details/28804.今天在Linux上用GDB...
2012-08-27 09:56:00
86
转载 二叉树的前序,中序,后序遍历
1. 二叉树中很多的操作都可以从对二叉树的遍历入手,在遍历的基础上对树中节点进行相关的操作或做相关的信息统计。本文主要讨论二叉树的三种遍历算法。2. 定义二叉树的结构体如下:1 struct Node2 {3 int m_data;4 Node* m_lChild;5 Node* m_rChild;6 Node(int da...
2012-08-26 22:11:00
132
转载 C语言中的细节
1. 逗号表达式 c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14。(a=3*5,a*4)的值是60 逗号表达式的形式如下: 表达式1,表达式2,表达式3,...... ,表达式n 逗号表达式的要领: (...
2012-08-26 20:42:00
101
转载 BloomFilter(布隆过滤器)
以下介绍转载自:http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的...
2012-08-26 16:41:00
87
转载 排列组合问题
转自博客:http://blog.csdn.net/star143133/article/details/6854745 代码见Problem28问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路:这是个递归求解的问题。递归算...
2012-08-25 15:42:00
116
转载 Coins in a Line
1. 题目:给定一组硬币排成直线(假设硬币数量为偶数),有两个人开始取硬币。每次只能从队列两端取硬币。有没有这样一种方案使先手取硬币,最后得到的硬币面值最大?给出这样一种方案并给出取法及最终获得的最大面值。2. 文章中给出了详细的解释,这类就不说了。3. 代码: 1 #include <iostream> 2 #include <cassert>...
2012-08-16 16:49:00
65
转载 找出和为k的所有组合
1. 题目:给定一个数组a(a中不存在重复元素)和一个值k,求出a中元素之和为k的所有组合。比如a为{7,3,6,2},k=7,则所有组和有2+2+3和7。2. 解析:回溯+递归。比较难以理解的是index索引的使用,代码如下:void printSum(int candidates[], int index[], int n) { for (int i = 1;...
2012-08-16 14:55:00
2343
转载 求两个有序数组归并之后的第k个最小值
1. 题目:给定两个有序数组(升序)。求两个数组合并之后的第k小值。2. 分析:常规算法将数组合并,之后从前向后遍历一次,找到k位的值,时间复杂度O(m+n)。改进之后的算法:不需要归并两个数组,而是使用两个指针分别从两个有序数组的起始向后走,如果a[i]<=b[j],那么i++,直到a[i]>b[j] ; 如果a[i]>=b[j],那么j++,直到a[i]<...
2012-08-16 14:08:00
287
转载 数组分段和最大值最小问题
1. 题目:给定一个数组,和一个值k,数组分成k段。要求这k段子段和最大值最小。求出这个值。2.分析:这道题目很经典,也很难,个人认为很难。文章中给出了三种算法:算法1,暴力搜索。本题暴力搜索算法并不是很明显,可以使用递归实现暴力搜索。递归首先要有递归式: nn-1M[n, k] = min...
2012-08-16 13:38:00
1035
转载 位运算
1. 面试的题目很多是关于位运算的。位运算包括:与,或,异或,取反,左移,右移。2.下面是几道位运算的经典题目。2.1 判断一个数是不是2的密次方?解析:一个数要是2的密次方,必然其二进制表示只有一位为1。所以题目转换为判读这个数是否只有一位为1??代码如下:1 bool IsTwoPower(unsigned int x) 2 { return !(x &a...
2012-08-16 10:09:00
79
转载 Multiplication of numbers
1. 题目:给定一个整数数组,要求输出一个数组,使新数组的第i位是原数组中除去第i位剩余数字的乘积。如输入{4,3,2,1,2},输出{12,16,24,48,24}。要求时间复杂度为:O(n),且不能使用除法运算。2. 分析:如果可以使用除法运算很容易想到的算法是将原数组中所有数字相乘,然后遍历,每次除以原数组中的第i位,即得到新数组中的第i位。但是这个算法有一个问题,要是原数组中...
2012-08-12 21:29:00
76
转载 螺旋输出二维矩阵
1. 题目:顺时针螺旋输出二维矩阵。2. 分析:螺旋输出二维矩阵,每次剥除最外层的数据,下次再输出里面的数据。很容易想到,这个可以用递归实现,在输出一圈时,输出顺序为:topLeft-->topRight-->bottomRight-->bottomLeft-->topLeft。在递归程序中怎样计算每一个元素的下标这个是关键。3. 代码: 1 #i...
2012-08-12 17:24:00
107
转载 String Reorder Distance apart
1. 题目:给定一个有小写字母组成的字符串,重组这个字符串,使相同字符之间的间隔至少为d。 Input:{a,b,b}, distance=2 output:{b,a,b}。2. 个人认为这道题目很有难度。初看时不知如何下手。结合文章中给出的算法,具体算法如下:主体的算法思想是“贪心算法”。出现次数最多的字符被选中放入新字符串的优先级最高,如果这个字符不能被选中(因为距离...
2012-08-12 16:57:00
76
转载 死锁
产生死锁的根本原因:资源有限且操作不当。 死锁的四个必要条件互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源(局部资源分配条件)。非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。循环等待条件(Ci...
2012-08-11 09:53:00
129
转载 给定一个数组,求出和为0的所有三元组
1. 题目:给定一个数组求出和为0的所有三元组,要求去除重复的情况,如[-1,0,1]和[0,-1,1]是相同的情况。2. 分析:有一道经典题目是:给定一个有序数组,求出和为0的所有二元组。这道题目通过两个指针,一个从前向后走,一个从后向前走。最终的时间复杂度为O(n)。本题是这道题目的变形或者说引申。最原始的算法:三重for循环,找出所有情况,时间复杂度为O(n^3)。不过,根据上...
2012-08-10 15:58:00
607
转载 在旋转有序数组中查找元素
1. 题目:给定一个旋转的有序数组,比如{7,8,9,10,1,2,3}是{1,2,3,7,8,9,10}旋转之后得到的,在数组中查找是否存在元素key。要求时间复杂度为O(lgn)。假定数组中不存在重复元素。2. 分析:从上面的选择数组可以发现,array[middle]将数组分成两段,两段中必有一段是有序的。这样就可以使用二分查找了。一个变形的二分查找。3. 代码:Vie...
2012-08-10 14:52:00
184
转载 使用putchar输出一个long型整数
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 ...
2012-08-10 10:25:00
821
转载 求给定字符串中的单词数
1. 题目:给定一个字符串,单词以' '或'\t'间隔,返回字符串中的单词个数。如输入:"\t ab\tc drf e ffrt\tert",输出为6。2. 解答: (1)我的思路:遍历字符串,遇到非' '或'\t',则count++,然后while循环跳过之后的所有非' '或'\t';如果是' '或'\t',然后while循环跳过所有的' '或'\t'。这样每次遇到非' ...
2012-08-09 16:55:00
98
转载 使用C代码去除字符串中的空格
1. 使用C代码去除字符串中的空格,void removeSpace(char* str)2. 解析: (1)主要考察C编程功底 (2)需要注意的问题:代码书写方式,整洁书写代码。 (3)虽然是一道简单的题目,但是很考察基础能力。3. 代码:View Code 1 #include <iostream> 2 #include <...
2012-08-09 16:00:00
163
转载 如何判断点在三角形内??
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:三角形的边做逆时针标准,如下图...
2012-08-09 10:37:00
226
转载 Finding intersection of two sorted arrays
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[...
2012-08-09 09:58:00
90
转载 单链表反转递归与非递归算法
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...
2012-08-08 20:14:00
115
转载 使用筛选法求N以内的素数
1. 使用筛选法求素数的思想是:使用一个bool isPrime[N]来存储一个数是不是素数的标志位。 首先偶数不是素数(2除外),将2的倍数isPrime全部设置为false。 i从3开始遍历,如果i为素数,则将i的倍数isPrime全部设置成false。这样就筛选掉了好多不是素数的数。 从0遍历isPrime[i]数组,如果值为true,则说明i为素数,否则i不是素...
2012-08-08 15:28:00
388
转载 并查集(union-find set or DisjointSets)
l 并查集:(union-find sets)一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。l 并查集的精髓(即它的三种操作,结合实现代码模板进行理解):1、Make_Set(x) ...
2012-08-08 11:26:00
187
转载 堆操作及应用
1. 堆是一个完全二叉树,堆主要设计到的操作有插入,删除,堆化。2. 堆的主要应用有堆排序:从小到大排序,使用大顶堆;从大到小排序,使用小顶堆。3. 下面以大顶堆为例,给出实现代码:View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespa...
2012-08-07 17:14:00
147
转载 位图(bitmap)实现与应用
1. 位图主要是为了节省空间,如一个整数有32位,那么可以用这个整数的32位来表示32个整数。2. 实现代码如下:View Code 1 #include<iostream> 2 #include <fstream> 3 #include <cassert> 4 5 using namespace std;...
2012-08-07 13:24:00
182
转载 Unique Path
参考文章:http://www.leetcode.com/2010/11/unique-paths.html 题目描述:给定一个m×n的方格,求方格(1,1)到点(m,n)的路径条数。路径只能向右或向下走。 文章中给出了三种算法: 算法1:最容易想到的也是最原始的回溯搜索算法,递归实现回溯。 算法2:由于在1回溯过程中,会做很多次重复计算。为了减少重复计算,使...
2012-07-27 20:09:00
78
转载 循环链表的插入操作
1. 参考文章http://www.leetcode.com/2011/08/insert-into-a-cyclic-sorted-list.html2. 测试代码View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 ...
2012-07-23 10:57:00
243
转载 字符串匹配问题
1. 参考文章http://www.leetcode.com/2011/09/regular-expression-matching.html2. 代码View Code 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 7...
2012-07-21 10:23:00
102
转载 求一个字符串中的最长回文字符串
1. 参考文章http://www.leetcode.com/2011/11/longest-palindromic-substring-part-i.html2. 文章中阐述了五种方法 (1)将str反转然后得到rstr,然后求str和rstr的最长公共子串。每次得到一个最长公共子串候选,还需要对子串下标和反转子串的原始下标进行判断,看是否相等:相等则得到的是合理的回文串;否...
2012-07-19 16:59:00
182
转载 判断一个整数是不是回文数
首先有以下几个问题需要考虑:1. 负数是不是回文数?这里假设负数不是回文数。2. 如果要求不能用额外的存储空间怎么办?下面的代码给出四种方法:View Code 1 #include <iostream> 2 #include <cassert> 3 #include <limits> 4 #inclu...
2012-07-18 21:06:00
90
转载 求一组随机数中的最大最小值最少比较次数
1. 求一组随机数中的最大值和最小值最少比较次数为3n/2-2取上整次,即大于等于3n/2-2的最小整数次。 当n为偶数时,为3n/2-2 当n为奇数时,为3n/2-3/22. 算法如下。第一步,将这组数据两两比较,将小数置于数组前半部分,大数置于数组后半部分。如果n为偶数,此次比较次数为n/2;如果n为奇数,此次比较次数为(n-1)/2,中间的那个数不做比较。第...
2012-07-17 15:49:00
671
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人