今天再总结几道题吧。
记得在算法面试题解答(二)中,我做了一个题目: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的操作,因此我们在面试的时候,搞清楚能不能改变原来的字符串是很重要
浙公网安备 33010602011771号