作业帮 PHP 社招二面面经

一面
  1. 优惠券排序:一个优惠券有面额和到期时间两种属性,按照面额从大到小排列,如果面额相同,按照到期时间的从小到大的顺序排列
    好久没有做过白板编程了,拿到题目的瞬间有点懵,想了好久才想出做法,真是对不起自己吹的牛逼,想到的是最简单最基本的快排(重点:快排的时间复杂度是O(nlogn))
<?php class Discount { public $money; public $time; function __construct($money, $time) { $this->money = $money; $this->time = $time;
    }
}

$discounts = []; for ($i = 0; $i < 10; $i++) {
    $discount = new Discount(rand(1, 10), time() - rand(1111, 9999));
    array_push($discounts, $discount);
}
print_r($discounts); function quick_sort($ds) { if (count($ds) <= 1) { return $ds;
    } else {
        $left = [];
        $right = []; for ($i = 1; $i < count($ds); $i++) { if ($ds[$i]->money > $ds[0]->money) {
                array_push($left, $ds[$i]);
            } else if ($ds[$i]->money < $ds[0]->money) {
                array_push($right, $ds[$i]);
            } else { if ($ds[$i]->time <= $ds[0]->time) {
                    array_push($left, $ds[$i]);
                } else {
                    array_push($right, $ds[$i]);
                }
            }
        }
        $left = quick_sort($left);
        $right = quick_sort($right); return array_merge($left, [$ds[0]], $right);
    }
}

$result = quick_sort($discounts);
print_r($result);

目前没有想到更好的方法,以后想到了或者遇到了在回来修改

  1. MySQL联合索引
    一直做得东西数据量都不大,所以没怎么用过索引,这次就正好被问到了,没答出来,这里记录一下
    联合索引的好处,一是一个联合索引能抵好几个索引,二是联合索引可以根据最左原则当成单个索引去用
  2. Linux日志分析
    这一块是原来完全没有接触过的内容,面试官说了awk之后才知道有这么个好东西,比我平时用的grep好用多了,这里就不多做介绍了,感觉自己还是只记住了名字

二面

  1. 有一个文件,里面每一行都是一个url,写一个算法,读取出现最多的五条,及其出现的次数
    白板编程,又懵了,硬着头皮写了一个
<?php function make_file() {
    $urls = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'];
    $num = count($urls);
    $file = fopen('data.txt', "w"); for ($i = 0; $i < 1000; $i++) {
        fwrite($file, $urls[rand(0, $num - 1)] . "\n");
    }
    fclose($file);
} //make_file(); function get_result($filename, $num) {
    $arr = [];
    $file = fopen($filename, 'r'); while (!feof($file)) {
        $key = fgets($file); if ($key != "") {
            array_push($arr, $key);
        }
    }
    fclose($file);
    $counts = array_count_values($arr);
    $results = [];
    $keys = array_keys($counts);
    print_r($keys); for ($i = 0; $i < $num; $i++) {
        $key = $keys[0]; foreach ($keys as $k) { if ($counts["$k"] > $counts["$key"]) {
                $key = $k;
            }
        }
        $results["$key"] = $counts["$key"]; unset($counts["$key"]);
    }
    print_r($results);
}

get_result('data.txt', 5);

写完面试官问还有没有更好的办法,没有回答上来,然后面试官给我指了指大门的位置……

作业帮,败北

牛客网的markdown编辑器太烂了,忍不了的童鞋可以去我的博客上看https://www.jianshu.com/p/e765e3822676


全部评论
第二题直接哈希表不就行了?以链接为键,然后接一个三元运算符?
点赞 回复 分享
发布于 2018-02-27 19:24
二面算法题  时间 空间有要求么?  hash最快
点赞 回复 分享
发布于 2018-01-05 14:48

相关推荐

评论
点赞
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务