今天再总结几道题吧。
记得在算法面试题解答(二)中,我做了一个题目:Two sorted array. Find kth smallest element: O(logK),我用的是类似于二叉搜索的方式做的,而最容易想到的方法是从两个数组的头开始比较,一旦找到第k大的数字就停止,而这种方式真要实现起来也不是那么轻松,麻烦就在于有很多边界条件需要处理。下面我们来写写试试吧:
int FindKthElement(const int *src1,int len1, const int *src2,int len2, int k, int *result) { if((len1+len2)<k || src1 == NULL || src2 == NULL || k == 0) return -1; int counter = 0; int i = 0 , j = 0 ; bool insrc2 = false; while(i<len1 && j<len2 && counter != k) { insrc2 = false; counter++; if(src1[i]>src2[j]) { insrc2 = true; j++; } else i++; if(counter == k) { *result = insrc2?src2[j-1]:src1[i-1]; return 0; } } if(i<len1) *result = src1[i + k-counter-1]; if(j<len2) *result = src2[j + k-counter-1]; return 0; }
越来越觉得这个题有点意思,那再设计一些测试用例吧:
1. {2},{3}; k=0, 1,2,3
2. {1,2},{3,4}; k=1,2,3,4
3. {1,3}, {2,4}; k=1,2,3,4
4. {3,4},{1,2}; k=1,2,3,4
5. {}, {1,2}; k=1, 2
6. {5,6},{}; k = 1,2
2. 使用mutex, critical section, event实现读写锁
3. 使用mutex, critical section, event实现Semaphore
4. 给定一个用字符串表示的大整数,任意位数,给出一个2字节的整数,求这个大整数对这个2字节整数取余的结果。知道了就很简单,但是不知道的,往往容易在算法上犯错误,代码如下:
short mod(char* a, short b) { int len = strlen(a); short mod = 0; for(int i=0;i<len;i++) { mod = (mod*10+a[i]-'0')%b; } return mod; }
5. 给定一个字符串,抽取字符串中所有出现在字符为一个新的字符串。比如123abbcc,变成1231bc。
int AbstractUniqueChars(char * src, int len) { If(src ==NULL) return 0; if(len <=1) return len; int k = 1; for(int i= 1;i<len;i++) { bool exist = false; for(int j=0;j<k;j++) //0-(k-1) are the unique chars, we can sort it and use binary search, but here, I just compare it one by one { if(src[i] == src[j]) { exist = true; break; } } if(!exist) src[k++] = src[i]; } memset(src+k, 0, len-k); return k; }
这个题目有意思的地方是可以做in place的操作,因此我们在面试的时候,搞清楚能不能改变原来的字符串是很重要