码迷,mamicode.com
首页 > 编程语言 > 详细

阿里在线笔试算法工程师附加题

时间:2015-04-06 15:48:26      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:

前几天参加了阿里的在线笔试,报的职位是算法工程师,笔试感觉难度适中,选择题包含数据结构、离散数学、小的智力问题还有一些读程序选结果的题目。其中数据结构和排列组合最多。当时比较慌乱,没做记录。只记下了三个附加题。

第一题很简单。要求实现一个方法,在两个排好序(升序)的整型数组中找到中位数。传入4个参数,分别是两个数组和他们的大小。这个题目既然简单就要写的高效一些。我用的归并排序的思想,将两个数组合并,在合并的过程中找到中位数。并对奇偶分情况讨论,注意偶数情况下有可能出现小数。代码如下:

double findMedianSortedArrays(int a[],int m,int b[],int n)
{
    int sum=m+n;
    double tmp = 0.0;
    if (sum %2==0)
    {
        int pivot=0;
        sum/=2;
        int i=0,j=0;
        while (pivot<sum)
        {
            if (a[i]<b[j])
            {
                tmp=a[i];i++;pivot++;
            }
            else
            {
                tmp=b[j];j++;pivot++;
            }
        }
        if (a[i]<b[j])
            tmp+=a[i];
        else
            tmp+=b[j];
        tmp/=2;
    }
    else
    {
        int pivot=0;
        sum=(sum>>1)+1;
        int i=0,j=0;
        while (pivot<sum)
        {
            if (a[i]<b[j])
            {
                tmp=a[i];i++;pivot++;
            }
            else
            {
                tmp=b[j];j++;pivot++;
            }
        }
    }
    return tmp;
}


第二题是说在2.5D游戏中,各个物体有可能出现重叠和遮挡。例如树、房子等物品。当玩家点击一个地方时,如何判断哪个物体被选中。问题要求是,选取什么样的数据结构和算法,并给出伪代码。这个题我基本不会,但是感觉和图形学里学习的可见性有点像。一个图形学的创始人曾说过,图形学就是排序。意思为当有多个物体需要显示时,哪个物体被遮挡哪个物体显示,排序一下就好了。因此,我就比较无耻的选了数组和排序算法。写了简单的伪代码,希望蒙混一下。

第三题是一个ACM的题,比较难一些。当时截了个图,不知道有没有版权问题。

技术分享


这个题的难处在于对时间复杂度和空间复杂度的要求。暴力的解法是O(n^2)的,空间复杂度要求不能额外申请与大小n有关d的数组。好在传过来的是一个数组,我们可以从前后同时向中间遍历。我想出的办法是:

用两个临时变量maxl和maxr记录两端向中间遍历时的最大值。max较小的一方采取行动,行动内容为访问下一个元素,如果这个元素小于max,那么max不变,该元素与max的差值为水数量。如果该元素大于max,max更新为该元素。直到两个游标相遇。

代码如下:

#include <iostream>
using namespace std;

int volume(int *height,int n)
{
    int max_l=height[0];
    int max_r=height[n-1];
    int i=0,j=n-1;
    int result = 0;
    while(i!=j)
    {
        if(max_l<=max_r)
        {
            i++;
            if(height[i]<max_l)
                result+=max_l-height[i];
            else
                max_l=height[i];
        }
        else
        {
            j--;
            if(height[j]<max_r)
                result+=max_r-height[j];
            else
                max_r=height[j];
        }
    }
    return result;
}
int main()
{
    int array[]={1,0,2,1,0,1,3,2,1,2,1};
    int result = volume(array,11);
    cout << result << endl;
    return 0;
}


阿里在线笔试算法工程师附加题

标签:

原文地址:http://blog.csdn.net/u010352695/article/details/44901887

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!