2018.07.31 融360面试(偏基础)
1、PHP常用函数,简单说几个。
答:数组操作函数array_chunk()数组分割,array_diff()计算数组差集,array_filter()通过回调函数过滤数组单元等;
字符串函数strlen()获取字符串长度,strpos()检索字符串内指定的字符或文本,md5()计算字符串的MD5散列,俗称MD5加密;
面试官点头,next Question
2、PHP连接mysql函数,是否有了解过?
答:mysql_connect()连接数据库,mysql_query()执行一条mysql语句等(这里大脑宕机,一开始忘了mysql_前缀);
next Question
3、mysql常见数据类型
答:int,bigint,float,char,varchar.(被打断)
问:mysql常用的日期类型有date、datetime等,你在平常项目中日期类型数据用什么格式存储?
答:会考虑时间戳。
问:为什么会选择时间戳?
答:使用时间戳更加灵活,用于时间比较和计算都比较方便。
面试官解答:日期存储类型应当根据业务场景来定,比如对于时间精度没有特别高要求的,使用datetime或者timestamp会更加直观,datetime的缺点是占用内存会更多,而timestamp占用内存少且查询性能上会更好。(如果不是业务需要,没必要精确到时间戳的那种格式)。
next Question
4、现在假设这样一个场景,我们有一个主管理员表Admin包含有id和name字段和一个用户表user包含有id、name、和一个adminID,现在我们要查询每一个管理员以及他所管理的用户的个数,sql语句应该怎么写?(万恶的手写代码)
答:count函数(手写select Admin.id,Admin.name,count(user.id) from Admin left join user on Admin.id=user.adminid group by user.adminid;)
next Question
5、看你在项目中使用过thinkphp,能不能说一下它的具体访问的架构?
答:由入口文件开始,可定义一些项目目录、系统常量并载入框架的入口文件。入口文件访问模块下的控制器,控制器操作模型,也就是常用的的mvc设计。
问:有没有使用或者了解过它的路由?
答:有了解过,用到的不多,thinkphp的路由使用起来不太方便,还经常出问题,很难调试,相对来说更习惯于laravel框架的路由模式,因为非特殊需求下,laravel的所有访问请求等都需要通过定义对应的路由并请求该路由来实现,所以用到的会比较多一点。
问:既然偏向于laravel,能不能说一下跟thinkphp相比,laravel好在哪里?(一个一直存在着撕逼的问题,说实话确实也不太知道laravel到底好在哪里,实在不想回答这个其实没什么营养的问题)
答:laravel里内置了大量的实现好的方法,从功能上来说会更加强大一些,具有更强大的扩展以及blade模版引擎,中间件也是它的一大特点,能实现对路由访问前后的处理,使请求更加安全(还有一些其他的回答就不罗列了,反正是乱说一气,至于laravel代码比较优雅这种坑还是不要给自己挖了。面试官估计也不太懂到底怎么个好法,这个问题直接过了)
next Question
6、我们再假设有一个这样的场景,要统计全北京所有座机电话号码的数目,该如何预估它的数据量大小,要开辟多大的内存空间?(重点来了,公司是做金融这一块的,对大数据接触的比较多,后面的问题一直围绕这个大数据的问题,各种问,直接给我怼懵逼了,而且面试官说的比我还多,感觉像是在教学生)
答:数据量的大小预估的话,可以根据电话号码的数字组成推断它的范围,确定大致的数据量,不过不太懂北京电话号码的各部分组成代表的含义。
面试官:那我们再简化一下这个问题,就假设时八位数的电话号码,该如何预估?(有点懵,不太确定面试官想要什么样的答案,感觉不会那么简单吧)
面试官:(直接抢了我的答案)最坏的情况也就是从最小的八个0到最大八个9。
答:对的,千万级数据。
面试官:(自顾自的说)上亿的数据,去除一些固定不允许使用的号码,其实也就是千万级数据(说一圈还是这个答案),那现在要你写一个方法对这上千万级的数据进行排序,该怎么做?(刚开始思考各种排序算法的时间空间复杂度等,还没回答,面试官直接顺势提出了排序算法的问题...我看其实就是想问排序算法的问题吧),能不能写几个你了解的常用的排序算法。
答:交换排序(冒泡)、快排、二分法等(手写了冒泡排序和快速排序的伪代码);
问:就拿冒泡排序来说,处理这种千万级的数据,具体怎么操作?(其实面试官就是希望能从算法的时间复杂度和空间复杂度来分析,但我这时候已经被面试官一通长篇大论打的有些懵了,稍微考虑了一下冒泡和快排的时间复杂度)
面试官直接问:以冒泡排序为例,他的时间复杂度是?
答:n平方。
面试官:对,那它的空间复杂度实际上就是n,其实也就是,我们应该通过时间复杂度考虑排序的效率问题,通过空间复杂度来考虑需要开辟多大的内存空间,千万级的数据,需要大概几个G的空间...(后面又说了一些,实在记不清了)
next Question
7、看你在项目中有做微信支付这一块。
答:对,是微信公众号支付,使用的第三方支付接口。
问:那能不能说一下它具体的支付流程?
答:我们使用的是第三方的支付接口,首先通过请求微信官方接口获取openid,将openid传入指定的参数数组,数组包含第三方指定的商户ID、数字签名以及回调函数地址等,然后模拟get请求将数组作为参数来请求第三方接口,通过访问第三方接口获取到的地址来拉起H5支付或APP内支付。
面试官:也就是说都是使用的第三方的接口,不是官方的。(其实第三方封装的支付流程跟官方的支付接口接入流程差不多,还可能会因为第三方的参数要求而更加复杂,不知道面试官为什么很在意这个)
next Question
其他还有一些小问题就不写了。总体来说这是我的第一次面试,虽然并不紧张,但是表现的蛮差的,主要还是不知道面试官的套路,加上约的下午两点半,因为不知道地铁情况,怕会迟到,所以去的很早,结果十二点五十就到地方,然后面试官一点就过来了,还没来得及喘口气就开始面试了,着实有些大脑短路。面试的时候一些自己用过的技术知识点都没能很好的答出来,不过面试官问的问题都比较偏基础,好好准备的话,这种面试还是不难通过的。