面试的两个上机题

难得的在现在这个点儿收到了个面试,不过人都没见到,只是先发了邮件让在有限的时间内做两道题。由于本来对纯粹的算法题不感兴趣么,主要是本身有点儿难而且略枯燥,特别是数学类的,最关键是平时或者工作中几乎都用不上,所以从来没在一些网站刷过啥题库之类的,当然偶尔有兴致时也会做两道就是。这次这个题么现在来看本身倒是不难,也不算纯粹的算法题,奈何当时确实没在有限时间内完全做出来,虽然现在做出来了也只有眼巴巴望着那么高的工资流口水了么,好歹还是想了会儿,费了些神和时间,只好记录下聊以什么下好了。不过确实有可能有会用得到的时候,这个场景还是比较常见的。当然题么就不照搬原题了,精简下,示例也只给个,是那个意思就行了。

问题1:

给定一个乱序的大数组,子元素是些只有两个整数表示范围的小数组,另给一个小数组求问给这个小数组的范围是否连续的包含在大数组整个的范围内。

示例:

$arr = [
    [0, 5],
    [6, 10],
    [18,39],
    [7,9]
];   // [1,8] 在范围内, [7,15]不在范围内

问题2:

给的大数组同问题1,问大数组最终全部连续的范围,中间有个空隙都不算,直接丢掉。

示例:

$arr1 = [
    [0, 5],
    [6, 10],
    [18,39],
    [7,9]
];   // 不连续

$arr2 = [
    [1,8],
    [4,7],
    [9,20],
    [5,10]
];  // 最终范围 1,20

解法

其实两个题一个解法的样子,所以只给第一个题的,后面个稍微改下就行了。

function sorts(&$arr)
{
    $t = array_column($arr, 0);
    array_multisort($t, SORT_ASC, $arr);
}

function isIn($target, $arr)
{
    foreach ($arr as $item) {
        if ($target[0] >= $item[0] && $target[1] <= $item[1]) {
            return true;
        }
    }
    return false;
}

function mergeArr($arr)
{
    sorts($arr);
    $target = [];
    while ($a = array_shift($arr)) {
        foreach ($arr as $i => $item) {
            if ($item[0] > $a[1] + 1) {
                break;
            }
            if ($a[1] + 1 == $item[0] || $a[1] <= $item[1]) {
                $a[1] = $item[1];
                unset($arr[$i]);
            }
        }
        $target[] = $a;
    }
    return $target;
}
$arr = [
    [0, 5],
    [6, 10],
    [18,39],
    [7,9]
]; 

var_dump(isIn([1,8], mergeArr($arr)));
var_dump(isIn([7,15], mergeArr($arr)));

不过由于没啥测试数据,也不保证完全正确,至于啥效率之类的么,不知道。。。。。。。。。。。

发表回复

您的电子邮箱地址不会被公开。