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分。这种计分方式加上试卷考点繁多,啥都考的特点,导致要拿高分的确不易,拿高分的都是基础扎实,知识面广的高手~
本文探讨了如何实现从字符串到双精度浮点数的转换,并提出了一种算法来解决给定一系列不同高度木板所构成的最大矩形面积问题。此外,还分析了算法的时间复杂度。

475

被折叠的 条评论
为什么被折叠?



