数据结构与算法
文章平均质量分 66
ngcl
大兔子
展开
-
找出带环单向链表的环入口(交点)
转自http://www.cnblogs.com/snake-hand/p/3148328.html转载 2014-10-03 20:29:55 · 616 阅读 · 0 评论 -
在字符串中删除特定的字符
转自:http://zhedahht.blog.163.com/blog/static/25411174200801931426484/题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。分析:这是一道微软面试题。在微软的常见面试题中,与字符转载 2014-06-13 18:19:38 · 841 阅读 · 0 评论 -
字符串中第一个只出现一次的字符
转自:http://zhedahht.blog.163.com/blog/static/25411174200722191722430/题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析:这道题是2006年google的一道笔试题。看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比转载 2014-06-13 16:08:47 · 524 阅读 · 0 评论 -
两链表的第一个公共结点
题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它转载 2014-06-13 15:02:29 · 400 阅读 · 0 评论 -
出现一次,两数
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我转载 2014-06-12 18:08:41 · 347 阅读 · 0 评论 -
zeroOnePack
1.问题描述 给定一个载重量为m,n个物品,其重量为wi,价值为vi,1 2.问题分析转载 2014-06-28 21:30:00 · 543 阅读 · 0 评论 -
反输出链表
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的转载 2014-06-03 20:32:08 · 446 阅读 · 0 评论 -
在O(1)时间删除链表结点
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode*pListHead, ListNode*pToBeDeleted);分析:这转载 2014-06-03 21:37:54 · 392 阅读 · 0 评论 -
findPair
void findPair(int A[], int n, int sum){ int beg = 0; int end = n - 1; while (beg < end) { if (A[beg] + A[end] == sum) { printf("%2d + %2d = %2d\n", A[转载 2014-06-03 13:51:03 · 603 阅读 · 0 评论 -
Array_Max_Divide
#include int ArrayMax(int A[], int l, int r){ int u, v; int m = (l + r) / 2; if (l == r) return A[l]; u = ArrayMax(A, l, m); v = ArrayMax(A, m + 1, r);转载 2014-06-02 21:23:30 · 433 阅读 · 0 评论 -
reverse_all_part_words
#include #include void reverse(char str[], int beg, int end){ char tmp; while (beg < end) { tmp = str[beg]; str[beg] = str[end]; str[end] = tmp; ++转载 2014-06-01 18:49:44 · 443 阅读 · 0 评论 -
UglyNumbers
转自:http://zhedahht.blog.163.com/blog/static/2541117420094245366965/转载 2014-06-13 20:02:40 · 494 阅读 · 0 评论 -
匹配
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html转载 2014-05-31 13:35:34 · 457 阅读 · 0 评论 -
ContinuousSum_n
void FindContinuousSequence (int n){ if (n < 3) return; int l = 1, r = 2; int sum = l + r; while ( l < (n + 1)/2 ) { if (sum < n) { ++r;转载 2014-06-03 17:12:37 · 362 阅读 · 0 评论 -
visit_tree
递归与非递归转换的基础知识是能够正确理解三种树的遍历方法:前序,中序和后序,第一篇就是关于这三种遍历方法的递归和非递归算法。如何用栈实现递归与非递归的转换(一)三种遍历树的算法一.为什么要学习递归与非递归的转换的实现方法? 1)并不是每一门语言都支持递归的. 2)有助于理解递归的本质. 3)有助于理解栈,树等数据结构.二.三种遍历树的递归和非递归算法 递归与非递转载 2014-06-01 16:42:48 · 585 阅读 · 0 评论 -
mirror_tree
void swap (Node** l, Node** r){ Node *t = *l; *l = *r; *r = *t;}转载 2014-06-02 19:41:37 · 395 阅读 · 0 评论 -
Hamming weight
The Hamming weight of a string is the number of symbols that are different from the zero-symbol of thealphabet used. It is thus equivalent to the Hamming distance from the all-zero string of t转载 2014-06-01 21:38:06 · 499 阅读 · 0 评论 -
Tree Diameter
The function below returns the diameter of a tree. A tree's diameter isdefined after the function. Write a recurrence for this function andsolve it yielding the running time using big-Oh in terms of t转载 2014-06-01 21:23:00 · 598 阅读 · 0 评论 -
last_k_list
ListNode* FindKthToTail_Solution2(ListNode* pListHead, unsigned int k){ if(pListHead == NULL) return NULL; ListNode *pAhead = pListHead; ListNode *pBehind = NULL;转载 2014-06-03 13:48:04 · 377 阅读 · 0 评论 -
min stack
题目:设计一个栈,使得PUSH、POP以及GetMin(获取栈中最小元素)能够在常数时间内完成。分析:很刚开始很容易想到一个方法,那就是额外建立一个最小堆保存所有元素,这样每次获取最小元素只需要O(1)的时间。但是这样的话,PUSH和POP操作就需要O(lgn)的时间了(假定栈中元素个数为n),不符合题目的要求。那么用1个辅助栈如何呢?解法:使用一个辅助栈来转载 2014-06-01 15:02:24 · 440 阅读 · 0 评论 -
The Knuth-Morris-Pratt
For the past few days, I’ve been reading various explanations of the Knuth-Morris-Pratt string searching algorithms. For some reason, none of the explanations were doing it for me. I kept banging my转载 2014-05-31 13:24:00 · 462 阅读 · 0 评论 -
a的n次方
我们可以用如下公式求a的n次方:这个公式很容易就能用递归来实现。新的PowerWithUnsignedExponent代码如下:double PowerExponent(double base, unsigned int exponent){ if(exponent == 0) return 1; if(exponent == 1) r转载 2014-06-14 16:27:08 · 1737 阅读 · 0 评论 -
string_match_index
#include #include using namespace std;int match(const string& target, const string& pattern){ int target_length = target.size(); int pattern_length = pattern.size(); int target_转载 2014-05-30 13:39:37 · 425 阅读 · 0 评论 -
链表倒序
//用递归实现 //很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理 //正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。。。 void recursion(node* head) { if(NULL==head)转载 2014-06-01 12:00:18 · 795 阅读 · 0 评论 -
shellsort
void shellsort(int v[], int n){ int gap, i, j, temp; for (gap = n/2; gap > 0; gap /= 2) for (i = gap; i < n; ++i) for (j = i - gap; j >= 0 && v[j] > v[j+gap]; j -= ga转载 2014-05-12 21:22:09 · 334 阅读 · 0 评论 -
binsearch
int binsearch(int v[], int x, int n){ int low = 0; int mid; int high = n - 1; while (low <= high) { mid = (low + high) / 2; if (x < v[mid]) high =转载 2014-05-12 20:40:11 · 739 阅读 · 0 评论 -
char *strcpy(char *des, const char *src)函数
地道的版本:char *strcpy (char *dst, const char *src){ char *s = src; while (*dst++ = *src++) ; return s;}转载 2014-03-12 19:13:04 · 869 阅读 · 0 评论 -
Heap-Sort
#include void swap (int* a, int* b) {*a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b;}int parent(int i) {return (i - 1) / 2;}int left (int i) {return 2 * i + 1;}int right (int i) {return 2 * i转载 2013-12-12 14:45:55 · 530 阅读 · 0 评论 -
二分搜索
int binarySearch(int x[], int n, int t){ int l = 0, u = n - 1, m; if(x[l] == t) return l; if(x[u] == t) return u; while (l <= u) { m = l + (u - l) / 2; if (x[m]转载 2013-12-09 17:33:14 · 375 阅读 · 0 评论 -
递规 exp(x, n)
int exp(x, n){ if (n == 0) return 1; else if (even(n)) return exp(x, n/2) * exp(x, n/2); else return x * exp(x, n-1);}转载 2013-12-09 16:40:06 · 482 阅读 · 0 评论 -
块交换算法
#include void swap(char x[], int i, int j, int k){ int temp; while (k-- > 0) { temp = x[i]; x[i] = x[j]; x[j] = temp; i++; j++; }}void gcdrot(char x[], int rotdis转载 2013-12-08 18:12:46 · 604 阅读 · 0 评论 -
翻手求逆算法
#include #include void reverse(char x[], int i, int j){ char tmp; while (i < j) { tmp = x[i]; x[i] = x[j]; x[j] = tmp; ++i; --j; }}int m转载 2013-12-08 14:11:55 · 695 阅读 · 0 评论 -
杂技算法
#include #include int gcd (int a, int b){ if (a == 0) return b; if (b == 0) return a; return gcd(b, a % b);}void reverse(char x[], int r, int n){ int i, j, k;转载 2013-12-08 13:33:38 · 709 阅读 · 0 评论 -
插入排序
void insertion_Sort (int A[], int length){ int i, j; int key; for (j = 1; j length; ++j) { key = A[j]; i = j - 1; while (i >= 0 && A[转载 2013-12-06 11:22:46 · 392 阅读 · 0 评论 -
反转单链表
思路:把头指针指向空,后面的结点指向前面的一个结点,最后的尾结点做新的头结点。转载 2013-10-09 14:11:33 · 533 阅读 · 0 评论 -
waterKing
int Find(int a[], int N){ int candidate; int nTimes, i; for(i = nTimes = 0; i < N; ++i) { if(nTimes == 0) { candidate = a[i], nTimes = 1; }转载 2014-05-07 21:10:53 · 382 阅读 · 0 评论 -
All_Perm
void All_Perm (int A[], int first, int size){ if (size < 2) return; for (int i = frist; i < first + size; ++i) { swap (A[i], A[first]); All_转载 2014-05-07 14:50:37 · 315 阅读 · 0 评论 -
shuffle1
#include void printArray(int A[], int size){ int i; for (i = 1; i < size; ++i) printf("%d ", A[i]); putchar('\n'); }void shuffer1(int A[], int B[], int n){ int i;转载 2014-05-11 17:11:05 · 319 阅读 · 0 评论 -
subMaxSum
采用分治法求解,时间复杂度为O(nlgn)#include #define LEN 16int A[LEN] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};int findMaxSubArray(int* A, int low, int mid, int high){ int max转载 2013-12-06 15:03:38 · 471 阅读 · 0 评论 -
gcd
原理:gcd (a, b) = gcd(b, a % b)int gcd (int a, int b){ if (a == 0) return b; if (b == 0) return a; else return gcd(b, a % b);}转载 2013-12-08 13:16:49 · 483 阅读 · 0 评论