zoukankan      html  css  js  c++  java
  • 算法面试题解答(五)

    今天再总结几道题吧。

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

  • 相关阅读:
    Android基于HttpUrlConnection类的文件下载
    Android的HttpUrlConnection类的GET和POST请求
    react修改静态文件根目录
    多维数组扁平化一维数组
    手把手教你实现三种绑定方式(call、apply、bind)
    css——圣杯布局
    错误码:events.js:183 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE :::8081
    怎么把本地项目和远程git仓库相连通
    toFixed奇葩问题
    HTML5浏览器端图片预览&生成Base64
  • 原文地址:https://www.cnblogs.com/whyandinside/p/2811538.html
Copyright © 2011-2022 走看看