今天再总结几道题吧。

记得在算法面试题解答(二)中,我做了一个题目: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的操作,因此我们在面试的时候,搞清楚能不能改变原来的字符串是很重要