最近面试有感

面试不一定是为了换工作,而是使自己保持危机感,同时了解业界动向和用人标准,做到跟随时代发展,避免在习惯的环境中温水住青蛙。

最近投了家公司,面试方式虽然也挺常见--机试,机试真是我不长的职业生涯中第一次遇上,在一个陌生的环境陌生的电脑中写代码,一切顺手的工具都没有,只有编辑器、相应环境和数据库(还不怎么好用),可能这能够完全考察出面试者的实力吧,无论去到哪里,拿起键盘就是干!

先来看看他们的题目

步骤1:使用PHP自带函数获取排行榜页面的完整HTML内容,保存在工作目录,命名为shoot.html。 (可选进阶操作:尽量伪装成用户浏览器行为,避免被新浪发现是采集程序) (提示: 如无法完成本步骤,可复制C:/web/data/shoot.html到你的工作目录内,以完成后续步骤)

步骤2:使用PHP自带函数读取shoot.html的内容,并使用正则表达式匹配出这50个球员的所有数据(排名、姓名、球队、射门数、左脚、右脚、头球、其它部位),保存到一个二维数组$shoot_arr。 (提示:$shoot_arr数组格式如下。如无法完成本步骤,可复制C:/web/data/shoot.php内的PHP代码到你的程序中得到结果,以完成后续步骤)

步骤3:随机打乱所有球员数据($shoot_arr)排列顺序,取出打乱顺序后前3个球员的数据保存到数组$rand_top3_arr(数组结构与$shoot_arr相同,键值从0开始)。 (提示:如无法完成本步骤,可跳过)

步骤4:遍历所有球员数据($shoot_arr),取出左脚射门次数在10至50之间的球员数据,并按照左脚射门次数从高到低排列,保存到数组$left_10to50_arr(数组结构与$shoot_arr相同,键值从0开始)。 (提示:如无法完成本步骤,可跳过)

步骤5:使用电脑桌面上的SQLyog数据库管理软件连接Mysql数据库,在test_db中创建数据表shoot_tbl,用于保存后续步骤保存$shoot_arr。 (提示:数据库账号:test密码:test。shoot_tbl请考虑是否需要添加索引。如无法完成本步骤,请复制C:/web/data/create_table.sql的内容在SQLyog中运行)

步骤6:在PHP程序中将$shoot_arr的数据保存到上一步骤建立的shoot_tbl,要求一个球员为一条记录,一个属性为一个字段。 (提示:可调用C:/web/include/mysql.inc.php操作数据库,也可自行编写操作数据库的代码。)

步骤7:在PHP程序中使用SQL语句查询出上榜球员最多的前5个球队和对应的球员数,保存到数组$top_team5中。 (提示:如无法完成本步骤,可跳过)

步骤8:写一个Class,该Class的构造函数传入参数$shoot_arr,返回一个重新排序的数组(数组结构与$shoot_arr相同,键值从0开始)。实例化并执行该Class,将结果保存到$sort_arr。排序规则如下:

所有球员按左脚射门次数从高到低排列
左脚射门次数相同的,再以右脚射门次数从高到低排序
左右脚射门次数均相同的,再以头球次数从高到低排序 (提示:如无法完成本步骤,可跳过)

可能大家在网上也会搜到,Google一下就会出来,然而其他引擎。。。。,大家意会即可。

第一题

没什么难度,熟悉file_get_contentsfile_put_contents即可,而且就一次获取,根本不用理会什么采集发现,后面他们发现这个问题,这里已经删改。

<?php
    $url = "http://match.sports.sina.com.cn/football/csl/opta_rank.php?item=shoot&year=2014&lid=8&type=1&dpc=1";
    
    $filename = "shoot.html";
    $str = file_get_contents($url);
    file_put_contents($filename, $str);

保存好,在终端运行相应的文件,比如我是保存1.php

php 1.php

比去浏览器刷新。。。,这个好很多了吧

第二题

虽然知道是考察正则,但考察的方式我个人觉得有问题(假如我是做面试官,当然,这是人家定的考察方式,我无法改变),如果不是做过相关项目而且刚好又对这个页面非常熟悉,这样的正则考察并不是最好的方式,而且页面又是td这些表格方式,做起来真的没什么胃口,下面是我参考网络写的

<?php
    $include = './shoot.html';
    $data = file_get_contents($include);
    // 正则表达式匹配球员数据
    /*
    排名、姓名、球队、射门数、左脚、右脚、头球、其它部位
    */
    $pattern = '/(<tr  (class="g" )?>)\s+\<td\>(\d+)\<\/td\>.*?blank\"\>(.*?)\<\/a\>.*?blank\"\>(.*?)\<\/a\>.*?td\>(\d+)\<.*?td\>(\d+)\<.*?td\>(\d+)\<.*?td\>(\d+)\<.*?td\>(\d+)\<.*?(<\/tr>)/s';
    $res = preg_match_all($pattern, $data, $match);
    /*
    排名、姓名、球队、射门数、左脚、右脚、头球、其它部位
    3,4,5,6,7,8,9,10
    */
    $shoot_arr = [];
    // $keys = array('排名', '姓名', '球队', '射门数', '左脚', '右脚', '头球', '其它部位');
    for ($i=0; $i < 50; $i++) { 
            $shoot_arr[$i] = [$match[3][$i], $match[4][$i], $match[5][$i], $match[6][$i], $match[7][$i], $match[8][$i], $match[9][$i], $match[10][$i]];
    }
    // var_dump($shoot_arr);

看正则这一坨,可能他们公司的人真的很牛逼,进去肯定能学到很多东西

第三题

<?php
    include './2.php';
    // 随机打乱
    shuffle($shoot_arr);
    // echo "<pre>";
    // print_r($shoot_arr);
    // echo "</pre>";
    // 截取数组
    $rand_top3_arr = array_slice($shoot_arr, 0, 3);
    echo "<pre>";
    print_r($rand_top3_arr);
    echo "</pre>";

这道题也有点奇怪,考察数组函数的用法,前面第二题卡住基本下面都不用做了

第四题

<?php
 
    include './02.php';
    $left_10to50_arr = array();
    foreach ($shoot_arr as $key => $value) {
        if ($value[4]>=10 && $value[4]<=50) {
            $left_10to50_arr[] = $value;
        }
    }
    // var_dump($left_10to50_arr);
    foreach ($left_10to50_arr as $key => $value) {
        $a1[] = $value[4];
    }
    // var_dump($a1);
    array_multisort($a1, $left_10to50_arr);
    $left_10to50_arr = array_reverse($left_10to50_arr);
    // var_dump($left_10to50_arr);

这道题完全就是业务代码,还是硬编码那种,不明白这种题的意义何在

第五题

CREATE TABLE `shoot`(
	`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`ranking` INT UNSIGNED NOT NULL,
	`player` VARCHAR(30) NOT NULL,
	`team` VARCHAR(30) NOT NULL,
	`shots` INT UNSIGNED NOT NULL,
	`lleg` INT UNSIGNED NOT NULL,
	`rleg` INT UNSIGNED NOT NULL,
	`head` INT UNSIGNED NOT NULL,
	`other` INT UNSIGNED NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

8012了,可能他们追求的就是这种手写sql数据表的快感,不是手写的东西一律都不行!

在Mac上用Sequal Pro很快搞定

第六题

嗯,这道题,没错就是考察你的sql,用最原始的mysql_connetc来搞定,而且这种CRUD操作又没有做事务处理,纯粹的foreach搞定,这是不合适的

后面的题

好吧,能坚持到现在我已经尽力了,一下子回到刀耕火种的时代,虽然话是说重点考察人的基础,但这种基础并不是什么特别重要的地方,稍微查资料即可,而且这种基础的考察方式已经脱离实际,没有考察到面试者的思考方式和解决问题的能力,过于简单粗暴的机试并不是放之四海而皆准的方式。

最最最重要的是

这份面试题在网上已经流传很久,面试官也仅仅是更改部分题目的部分变量而已,实际他们也是需要实时查看才知道是否正确。这告诉我们什么道理?

善用Goolge,远离百度

原题在这

Show Comments