• 算法面试题解答(五)


    今天再总结几道题吧。

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

  • 相关阅读:
    golang变量2
    golang1
    golang api接收get,post请求读取内容方法
    docker2
    docker
    渗透1
    Crawley框架
    spider类
    爬豆瓣阅读遇到的问题
    CrawlSpiders类
  • 原文地址:https://www.cnblogs.com/whyandinside/p/2811538.html
Copyright © 2020-2023  润新知