1. 最短前缀
问题描述:输出字符串的最短前缀匹配
例如:abc abad bc
最短前缀就为:abc aba b
Trie树的典型应用
#include #include #include #include using namespace std; struct Node{ char word; int count; struct Node *child[26]; Node() { count = 0; for(int i=0; i<26; i++) child[i] = NULL; } }; /** * insert into trie tree */ void insert(Node *root, char *in) { int len = strlen(in); Node *ptr = root; for(int i=0; ichild[index]){ ptr->child[index] = new Node(); } ptr = ptr->child[index]; ptr->count++; } } /** * If the node's count equals 1, it's the minimum suffix */ void find(Node *root, char *in, char *out) { int len = strlen(in); Node *ptr = root; int i = 0; for(; ichild[index]; if(1 == ptr->count) break; } int j = 0; for(; j<=i; j++) out[j] = in[j]; out[j] = '/0'; } void destory(Node *root) { for(int i=0; i<26; i++){ if(NULL != root) destory(root->child[i]); } delete root; } void prefix(char *filename) { ifstream cin(filename); char word_in[1024][30]; char word_out[1024][30]; Node *root = new Node(); int i = 0; while(cin>>word_in[i]){ insert(root, word_in[i]); i++; } /* move to the begin of the file */ cin.seekg(0); for(int j=0; j
2. 最大子矩阵和(DP)
#include #include using namespace std; /** * array[n][m] */ int max_array_sum(int **array, int n, int m) { int max_sum = 0; for(int i=0; i max_sum){ max_sum = cur_sum; } } } } return max_sum; } int main() { int a1[3] = {0,1,2}; int a2[3] = {-2,-1,5}; int *a[2] = {a1, a2}; cout<
3. 给定数组a[n], 任意两个元素做差,求最大差值
#include using namespace std; int a[] = {1,2,3,4,5,99,-98,100}; /** * find max and min element */ int max_delta_1() { int max = a[0]; int min = a[0]; for(int i=0; i max) max = a[i]; } return max-min; } int max_array(int *a, int n) { int max_sum = 0; int cur_sum = 0; for(int i=0; isum2?sum1:sum2; } int main() { cout<
4. 木棍上随机放置若干个蚂蚁,方向不确定,如果蚂蚁碰面则各自往回爬,求最后一只蚂蚁爬离木棍的时间?
答案:离端点最远的那只蚂蚁爬出的时间为总时间。
5. 路标问题,判断是否为合法路标
问题描述:给定一个数组a[n],里面的每一个元素为一个路标,判定是否为一组合法路标(路标可能被风吹的反向),给定总距离
例如:从上海到北京全长为11,放置路标a[n]数组为{ 1 3 6 2 10 }
上述为合法数组,因为把2反向的话就为{1 3 6 9 10},满足递增序
思路:从a[0]开始,调整后面的元素,使序列递增,且使增量最小,如果整个序列都可以满足该条件,则是合法路标。
#include using namespace std; /* guidepost array */ const int a[] = {1, 7, 5, 9, 4, 1}; /* total length */ const int L = 10; inline int min(int a, int b) { return ab?a:b; } bool is_valid_guidepost() { /* adjust array with minimal increment. * If sorted, then we judge them as valid guideposts */ int num = sizeof(a)/sizeof(int); int b[num]; /* sort ascending */ b[0] = min(a[0], L-a[0]); for(int i=1; i
6. 大数相加,可能为浮点数
#include #include #include using namespace std; /** * @param in: float string * @param out: string without decimal point * @return length of decimal */ int remove_decimal_point(char *in, char *out) { int len = strlen(in); int len_decimal = len; for(int i=0; i '9') return false; int len = strlen(a); int num = 0; for(int i=1; i '9'){ if(a[i] == '.'){ ++num; if(num > 1) return false; } else return false; } } if(a[len-1] < '0' || a[len-1] > '9') return false; return true; } int add(char *a, char *b, char *c) { /* invalid check */ if( !a || !b || !c) exit(-1); if(!is_valid(a) || !is_valid(b)) exit(-1); /* temporary buffer * remove decimal point if any */ char tmp_a[1024] = {'/0'}; char tmp_b[1024] = {'/0'}; char tmp_c[1024] = {'/0'}; int len_a_decimal = remove_decimal_point(a, tmp_a); int len_b_decimal = remove_decimal_point(b, tmp_b); int len_c_decimal = 0; /* add '0' */ if(len_a_decimal > len_b_decimal){ len_c_decimal = len_a_decimal; memset(tmp_b + strlen(tmp_b), '0', len_a_decimal - len_b_decimal); } else{ len_c_decimal = len_b_decimal; memset(tmp_a + strlen(tmp_a), '0', len_b_decimal - len_a_decimal); } cout<<"tmp_a:"<len_tmp_b ? len_tmp_a : len_tmp_b; for(int i=0; i
7. 二维数组排序,数组很大,size[i]表示i行有多少列,len表示有多少行
void sort(int **array, int *size, int len) //二维数组排序
#include #include #define MAX_INT 0x7fffffff using namespace std; bool is_all_null(int **ptrs, int len) { for(int i=0; i= pivot) --right; a[left] = a[right]; while(left < right && a[left] <= pivot) ++left; a[right] = a[left]; } a[left] = pivot; /* recursion */ quick_sort(a, low, left-1); quick_sort(a, left+1, high); } } void print_array(int **a, int *size, int len) { for(int i=0; i
8. a[n]代表n个木桶里面的球数,如何使桶中的球变均衡(尽量均衡,球数相差最多为1个),并且移动次数最少
思路:排序,求得平均值,后面的桶(球数多)向前面的桶移动球...如果平均值不是整数,移动球数需要更精确控制。