• 【面试题】面试题集四


    1.【美团】给定一个整型数组arr, 数组长度为len,现存在a,b满足0<=a<=b<len,求arr[b]-arr[a]的最大值。

    示例:

    arr:[10, 5]

    len:2

    ans:0

    思路:

    如果对每个arr[a]比较下标a之后的每个元素,时间复杂度将达到O(n^2),也是最简单的方法。如果我们先对arr进行处理,则可以转为另一个问题。

    我们先对arr求差分(后一个元素减去前一个元素),得出一个新的数据diff(diff首个元素为0,因为diff[0]=arr[0]-arr[0]=0),那么题目的要求max{arr[b]-arr[a]}则可以理解为求解diff数组的最大子数组和。此时,时间复杂度将降为O(n)。

    比如:

    示例中的arr:[10, 5],diff:[0, -5],则最大子数组和为0,即max{arr[b]-arr[a]} = 0;

    arr:[1, -2, 3, -4, 10],diff:[0, -3, 5, -7, 14],则max{arr[b]-arr[a]} = arr[4]-arr[3] = 10-(-4) = diff[4] = 14;

    arr:[-1, 2, -3, 4, 10],diff:[0, 3, -5, 7, 6],则max{arr[b]-arr[a]}=arr[4]-arr[2] = 10-(-3) = diff[3]+diff[4] = 13;

    因此可以得出如下解答:

    int maxsum(int a[],int n)      
    {    
        int max=a[0];       
        int sum=0;  
        int j;  
        for(j=0;j<n;j++)    
        {    
            if(sum>=0)     
                sum+=a[j];    
            else       
                sum=a[j];  
            if(sum>max)    
                max=sum;    
        }    
        return max;    
    } 
    
    int maxdiff(int *array, int len){
    	int *diff, i, j;
    
    	diff = (int*)malloc(len*sizeof(int));
    	*diff = 0;
    	for(i=1; i<len; ++i){
    		*(diff+i) = *(array+i)-*(array+i-1);
    	}
    	return maxsum(diff, len);
    }
    
    int array[] = {1,2,3};
    #define array_size sizeof(array)/sizeof(int)
    int main(void){
    	printf("maxdiff of array is:%d
    ", maxdiff(array, array_size));
    	system("pause");
    	return 0;
    }
    

    2.【美团】求字典序在字符串s1和字符串s2之间的,长度不超过len的字符串个数,其中s1和s2长度不超过100,len不超过10000000,输出结果mod 1000007。

    示例:

    输入:

    s1:ab

    s2:ce

    len:2

    输出:

    56(ac,...az,b,ba,...,bz,c,ca,...,cd)

    思路:

    字典序顾名思义,表示字典中的排序,比如长度为1的字符串排序为a,b,c,...,z,长度为2的字符串排序为aa,ab,...,az,ba,...,bz,...,za,...,zz;

    固定长度下,比如上面说到的长度为2的字符串排序,类似于一个26进制('a'->0, 'b'->1...如此类推),但计算26进制的数值需要注意超出存储空间;,

    1)当要求len大于字符串长度时,往字符串末尾补a,并因为a表示数值0,所以并不影响其26进制所计算出来的,比如c_,长度为2时,补齐为ca即可;

    2)当len小于或者等于s1长度时,比如s1:abc和s2:bcd,这时候是不包含abc的,所以需要减去1,不同于len大于字符串长度时,abc_补a时,是包含abca的,所以不需要减1;

    3)当len小于s2长度时,比如abc,但要求len为2,则ab是应该被包含进去的,所以需要加上1.

    #define VAL_LIMITED	1000007
    static int *base_table;
    void base26_cal_init(int len){
    	int i,j;
    
    	base_table = (int*)malloc(len*sizeof(int));
    	*base_table = 1;
    	for(i=1; i<len; ++i){
    		*(base_table+i) = *(base_table+i-1)*26;
    		*(base_table+i) %= VAL_LIMITED;
    	}
    }
    
    int base26_cal(char *s, int len){
    	int s_len, i; 
    	int val;
    
    	s_len = strlen(s);
    	for(i=0, val=0; i<s_len&&i<len; ++i){
    		val += (*(s+i)-'a')*(*(base_table+len-i-1));
    		val %= VAL_LIMITED;
    	}
    
    	return val;
    }
    
    int number_dict(char *s1, char *s2, int len){
    	int s1_len, s2_len;
    	int i, j, num;
    	int s1_val, s2_val;
    
    	if(strcmp(s2, s1)<0)
    		return 0;
    
    	s1_len = strlen(s1)-1;	s2_len = strlen(s2)-1;
    	*(s1+s1_len)='';	*(s2+s2_len)='';
    	num = 0;//s2_len-s1_len;
    	for(i=len; i>0; --i){
    		s1_val = base26_cal(s1, i);
    		s2_val = base26_cal(s2, i);
    		num += (s2_val-s1_val<0)?s2_val-s1_val+VAL_LIMITED:s2_val-s1_val;
    		if(i<=s1_len)
    			--num;
    		if(i<s2_len)
    			++num;
    		num %= VAL_LIMITED;
    	}
    	
    	return num;
    }
    
    int main(int argc, char *argv[]){
    	char test1[101], test2[101];
    	int testlen;
    	
    	while(scanf("%d", &testlen) && testlen>0){
    		getchar(); //del enter
    
    		fgets(test1, sizeof(test1), stdin);
    		fgets(test2, sizeof(test2), stdin);
    
    		base26_cal_init(testlen);
    		printf("num of string among "%s" and "%s" is:%d
    ", test1, test2, number_dict(test1, test2, testlen));
    		free(base_table);
    	}
    
    	system("pause");
    	return 0;
    }



  • 相关阅读:
    Informatica 常用组件Lookup缓存之五 使用动态查找高速缓存
    Informatica 常用组件Lookup缓存之四 使用不高速缓存的查找或静态高速缓存
    Informatica 常用组件Lookup缓存之三 重建查找高速缓存
    Golang入门教程(十一)beego 框架之RESTful Controller 路由
    PHP7 学习笔记(十二)PHPExcel vs PhpSpreadsheet and PHP_XLSXWriter
    PHP7 学习笔记(十二)gRPC
    PHP7 学习笔记(十一)使用phpstudy快速配置一个虚拟主机
    Golang入门教程(十)内建函数
    Golang入门教程(九)复合数据类型使用案例二
    Golang入门教程(八)复合数据类型使用案例一
  • 原文地址:https://www.cnblogs.com/xhyzjiji/p/6159357.html
Copyright © 2020-2023  润新知