PHP 算法面试题及详细答案(职场实战版)_第1页
PHP 算法面试题及详细答案(职场实战版)_第2页
PHP 算法面试题及详细答案(职场实战版)_第3页
PHP 算法面试题及详细答案(职场实战版)_第4页
PHP 算法面试题及详细答案(职场实战版)_第5页
已阅读5页,还剩6页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP算法面试题及详细答案(职场实战版)本套面试题贴合初中级PHP工程师真实面试场景,摒弃理论化空话,全部为实操高频考题,包含基础算法、数据结构、常用排序、经典逻辑题,答案附带详细思路、代码注释和场景说明,适合面试刷题、技术复盘。一、基础逻辑算法题(入门高频)1、用PHP实现斐波那契数列(两种写法:循环+递归)题目描述:斐波那契数列规则:1、1、2、3、5、8、13...前两位为1,从第三位开始,每一位等于前两位之和。输入数字n,输出前n项数列。解题思路:递归写法代码简洁但大数据量有性能问题;循环写法效率更高,职场开发优先使用循环。答案代码:php

<?php

//循环写法(推荐,性能优)

functionfibLoop(int$n):array

{

$res=[];

if($n>=1)$res[]=1;

if($n>=2)$res[]=1;

for($i=2;$i<$n;$i++){

$res[]=$res[$i-1]+$res[$i-2];

}

return$res;

}

//递归写法(面试常考原理)

functionfibRecursion(int$n)

{

if($n==1||$n==2)return1;

returnfibRecursion($n-1)+fibRecursion($n-2);

}

//测试

print_r(fibLoop(10));

?>面试延伸:递归写法存在大量重复计算,时间复杂度O(2ⁿ),循环写法时间复杂度O(n),实际项目中禁止递归实现大数斐波那契。2、PHP判断一个数是否为质数题目描述:质数(素数)指大于1的自然数,除了1和自身外,无法被其他自然数整除。编写函数判断输入数字是否为质数。解题思路:1、小于2的数不是质数;2、2是唯一的偶数质数;3、只需遍历到根号n即可,减少循环次数,优化性能。答案代码:php

<?php

functionisPrime(int$num):bool

{

//小于2直接排除

if($num<2)returnfalse;

//2是质数

if($num==2)returntrue;

//偶数直接排除

if($num%2==0)returnfalse;

//遍历到根号num,步长2(只判断奇数)

$sqrt=sqrt($num);

for($i=3;$i<=$sqrt;$i+=2){

if($num%$i==0){

returnfalse;

}

}

returntrue;

}

//测试

var_dump(isPrime(17));//true

var_dump(isPrime(20));//false

?>二、字符串算法(面试必考)1、PHP反转字符串(不使用strrev函数)题目描述:不使用PHP内置反转函数,手动实现字符串反转,支持中英文混合。解题思路:将字符串转为数组,首尾交换位置,循环遍历完成反转,兼容中文字符截取。答案代码:php

<?php

functionreverseStr(string$str):string

{

//拆分字符串为字符数组(兼容中文)

$arr=preg_split('/(?.)/u',$str,-1,PREG_SPLIT_NO_EMPTY);

$len=count($arr);

$newStr='';

//倒序拼接

for($i=$len-1;$i>=0;$i--){

$newStr.=$arr[$i];

}

return$newStr;

}

//测试

echoreverseStr('PHP算法面试');//试面法算PHP

?>2、统计字符串中每个字符出现的次数题目描述:输入任意字符串,统计每个字符的出现次数,返回统计数组,区分大小写、兼容中文。答案代码:php

<?php

functioncountChar(string$str):array

{

$arr=preg_split('/(?.)/u',$str,-1,PREG_SPLIT_NO_EMPTY);

$res=[];

foreach($arras$char){

if(isset($res[$char])){

$res[$char]++;

}else{

$res[$char]=1;

}

}

return$res;

}

//测试

print_r(countChar('abccbaPHP'));

?>3、去除字符串中重复字符(保留首次出现顺序)解题思路:遍历字符,通过数组键名唯一性去重,保证字符顺序不打乱。答案代码:php

<?php

functionuniqueStr(string$str):string

{

$arr=preg_split('/(?.)/u',$str,-1,PREG_SPLIT_NO_EMPTY);

$temp=[];

$newStr='';

foreach($arras$char){

if(!isset($temp[$char])){

$temp[$char]=true;

$newStr.=$char;

}

}

return$newStr;

}

//测试

echouniqueStr('aabbcc1122');//abc12

?>三、数组经典算法(职场最常用)1、数组去重(不使用array_unique)题目分析:内置array_unique效率较低,大数据量优先手动去重,利用数组键名唯一特性实现。答案代码:php

<?php

functionarrayUnique(array$arr):array

{

$temp=[];

foreach($arras$val){

$temp[$val]=$val;

}

//重置数组索引

returnarray_values($temp);

}

//测试

$testArr=[1,2,2,3,3,3,4];

print_r(arrayUnique($testArr));

?>2、找出数组中最大值、最小值(不使用内置函数)解题思路:假设第一个元素为最大/最小值,遍历数组逐一对比替换。答案代码:php

<?php

functiongetMaxMin(array$arr):array

{

$max=$arr[0];

$min=$arr[0];

foreach($arras$v){

if($v>$max)$max=$v;

if($v<$min)$min=$v;

}

return['max'=>$max,'min'=>$min];

}

//测试

$arr=[5,2,9,1,7,3];

print_r(getMaxMin($arr));

?>3、二维数组根据指定字段排序题目场景:后端开发高频场景,用户列表、商品列表排序,手动实现二维数组排序。答案代码:php

<?php

//$field排序字段$sort1升序-1降序

functionarraySort(array$arr,string$field,int$sort=1):array

{

usort($arr,function($a,$b)use($field,$sort){

if($a[$field]==$b[$field])return0;

return($a[$field]<$b[$field])?$sort:-$sort;

});

return$arr;

}

//测试数据

$user=[

['name'=>'张三','age'=>22],

['name'=>'李四','age'=>18],

['name'=>'王五','age'=>25]

];

//按年龄降序

print_r(arraySort($user,'age',-1));

?>四、常用排序算法(面试核心)1、冒泡排序(基础必考)原理:相邻元素两两对比,大的往后排,每轮循环确定一个最大值,像气泡上浮。答案代码:php

<?php

functionbubbleSort(array$arr):array

{

$len=count($arr);

//外层控制循环轮数

for($i=0;$i<$len-1;$i++){

//内层对比相邻元素

for($j=0;$j<$len-1-$i;$j++){

if($arr[$j]>$arr[$j+1]){

//交换位置

$temp=$arr[$j];

$arr[$j]=$arr[$j+1];

$arr[$j+1]=$temp;

}

}

}

return$arr;

}

//测试

$arr=[3,1,4,2,5];

print_r(bubbleSort($arr));

?>2、快速排序(高效排序,面试重点)原理:选取基准值,将数组分为左右两部分,小于基准值放左边,大于放右边,递归拆分排序,效率远高于冒泡。答案代码:php

<?php

functionquickSort(array$arr):array

{

$len=count($arr);

if($len<=1)return$arr;

//取第一个元素为基准值

$base=$arr[0];

$left=$right=[];

//遍历拆分

for($i=1;$i<$len;$i++){

if($arr[$i]<$base){

$left[]=$arr[$i];

}else{

$right[]=$arr[$i];

}

}

//递归合并

returnarray_merge(quickSort($left),[$base],quickSort($right));

}

//测试

$arr=[6,2,8,1,9,3];

print_r(quickSort($arr));

?>五、经典算法面试真题(压轴题)1、两数之和题目描述:给定一个整数数组和一个目标值,找出数组中两个相加等于目标值的下标,假设每组输入只有一个答案。解题思路:利用哈希数组存储已遍历的值,一次循环完成匹配,时间复杂度O(n)。答案代码:php

<?php

functiontwoSum(array$nums,int$target):array

{

$temp=[];

foreach($numsas$k=>$v){

//计算需要匹配的值

$diff=$target-$v;

if(isset($temp[$diff])){

//返回两个下标

return[$temp[$diff],$k];

}

$temp[$v]=$k;

}

return[];

}

//测试

$nums=[2,7,11,15];

$target=9;

print_r(twoSum($nums,$target));//[0,1]

?>2、二分查找(有序数组查找)题目描述:在有序数组中查找指定值,存在返回下标,不存在返回-1。原理:每次取中间值对比,缩小一半查找范围,时间复杂度O(logn),高效适配大数据有序数组。答案代码:php

<?php

functionbinarySearch(array$arr,int$val):int

{

$left=0;

$right=count($arr)-1;

while($left<=$right){

//取中间下标

$mid=intval(($left+$right)/2);

if($arr[$mid]==$val){

return$mid;

}elseif($arr[$mid]>$val){

//目标值在左半部分

$right=$mid-1;

}else{

//目标值在右半部分

$left=$mid+1;

}

}

return-1;

}

//测试(有序数组)

$arr=[1,3,5,7,9,11];

echobinarySearch($arr,7);//3

?>3、递归实现层级无限分类(树形结构)职场场景:后台菜单、商品分类、地区层级,PHP面试高频压轴题。题目描述:一维分类数组,根据pid上下级关系,递归生成树形二维数组。答案代码:php

<?php

//生成树形结构

functiongetTree(array$list,int$pid=0):array

{

$tree=[];

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论