现在的位置: 首页 > 综合 > 正文

2014.3.29腾讯实习生附加题

2017年10月17日 ⁄ 综合 ⁄ 共 1123字 ⁄ 字号 评论关闭

1.实现string到double的转换

 

此题类似于atoi函数,但是明显double为64位,而且支持小数,因而边界条件更加严格,要想写出正确而且完整的代码不容易。

 

此题可作为atoi的扩展题。

 

2.给定整型数组,其中每个元素表示木板的高度,木板的宽度都相同,求这些木板拼出的最大矩形的面积。并分析时间复杂度。

 

此题类似leetcode里面关于连通器的题,需要明确的是高度可能为0,长度最长的矩形并不一定是最大矩形,还需要考虑高度很高,但长度较短的矩形。

 

此题可作为最大连续数组的最大和系列的扩展。

 

如[5,4,3,2,4,5,0,7,8,4,6]中最大矩形的高度是[7,8,4,6]组成的矩形,面积为16.所以此题使用分治递归来解比较容易,代码如下。

 

 
//最大值 
template <classT> 
T MAX(T a,T b) 
{ 
    return a > b ? a : b; 
} 
//给定数组表示单位宽度木板的高,求最大矩形的面积 
int MaxSquare(int*a,int start,int end,int &Max) 
{ 
    if(end < start) 
        return 0; 
    if(end == start) 
        return a[end]; 
 
    int minindex = start; 
    for(int i = start;i <=end;i++)//每次求出区间的最小高度 
        if(a[i] < a[minindex]) 
            minindex = i; 
    int all = a[minindex] * (end - start +1);//以最小高度的最长矩形的面积 
    int lf = MaxSquare(a,start,minindex -1,Max);//左区域的最大面积 
    int rg = MaxSquare(a,minindex +1,end,Max);//右区域的最大面积 
    int t =MAX(all,MAX(lf,rg));//当前区间的最大面积 
    Max = MAX(Max,t); 
    return t; 
} 
 
int MaxSquare(int*a,int n) 
{ 
    int minindex = 0; 
    int max = 0; 
    MaxSquare(a,0,n-1,max); 
    return max; 
} 

 

算法的耗时主要是每次都要遍历区间一次求出最小高度,因为该区间的最小高度可能不止一个,即多个相同的最小高度,只是位置不一样,取第一个最小高度来划分区间。

分治思想的时间复杂度应该在O(NlogN)。

 

可能有更多优化的地方,甚至有非递归的写法,但个人感觉非递归不好写。

 

 

顺便吐槽下QQ君的笔试,仍然秉承着每年什么都考,保罗万象的特点,而且25道选择题,每题4分,还是不定向选择,少选、错选、不选都是0分。这种计分方式加上试卷考点繁多,啥都考的特点,导致要拿高分的确不易,拿高分的都是基础扎实,知识面广的高手~

抱歉!评论已关闭.