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

下载本文档

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

文档简介

PHP算法面试题及详细答案(实战版)本套面试题贴合企业真实PHP面试场景,剔除小众难题,聚焦业务开发高频算法、逻辑题型,涵盖字符串处理、数组算法、排序查找、经典逻辑题,所有答案均为原生PHP手写代码,适配日常面试笔试、自测复习。一、基础字符串算法(高频必考)1.写一个函数,反转字符串,不能使用strrev()函数题目要求:自定义算法实现字符串反转,兼容中英文、普通字符,不调用PHP内置反转函数。解题思路:将字符串转为字符数组,从末尾开始遍历拼接,通过循环倒序实现反转。php

/**

*自定义字符串反转

*@paramstring$str

*@returnstring

*/

functionreverseString(string$str):string

{

$len=strlen($str);

$newStr='';

//从最后一位字符向前遍历

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

$newStr.=$str[$i];

}

return$newStr;

}

//测试

echoreverseString('abc123');//输出:321cba

echoreverseString('hello');//输出:olleh2.判断字符串是否为回文字符串题目要求:回文指正读、反读完全一致的字符串,如level、12321,忽略大小写(可选),实现判断函数。解题思路:双指针法,首尾字符两两比对,出现不一致直接返回false,全部匹配则为回文。php

functionisPalindrome(string$str):bool

{

//统一转小写,忽略大小写差异

$str=strtolower($str);

$len=strlen($str);

$left=0;

$right=$len-1;

while($left<$right){

//首尾字符不相等,不是回文

if($str[$left]!==$str[$right]){

returnfalse;

}

$left++;

$right--;

}

returntrue;

}

//测试

var_dump(isPalindrome('level'));//bool(true)

var_dump(isPalindrome('hello'));//bool(false)3.统计字符串中每个字符出现的次数题目要求:输入任意字符串,输出每个字符的出现次数,不区分大小写。解题思路:定义空数组存储统计结果,遍历字符串,逐个字符累加计数。php

functioncountChar(string$str):array

{

$str=strtolower($str);

$count=[];

$len=strlen($str);

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

$char=$str[$i];

//存在则+1,不存在则初始化为1

$count[$char]=isset($count[$char])?$count[$char]+1:1;

}

return$count;

}

//测试

print_r(countChar('HelloWorld'));二、数组经典算法(业务最常用)1.数组去重,不使用array_unique()函数题目要求:手动算法实现一维数组去重,适配数字、字符串数组,保留原有顺序。解题思路:遍历原数组,通过判断元素是否已存入新数组,实现去重。php

functionarrayDeduplicate(array$arr):array

{

$newArr=[];

foreach($arras$val){

//未存在则写入新数组

if(!in_array($val,$newArr)){

$newArr[]=$val;

}

}

return$newArr;

}

//测试

$testArr=[1,2,2,3,3,3,'a','a','b'];

print_r(arrayDeduplicate($testArr));

//输出:Array([0]=>1[1]=>2[2]=>3[3]=>a[4]=>b)2.找出数组中最大值和最小值,不使用max()、min()函数题目要求:纯循环比对实现极值查找,适配纯数字数组。解题思路:默认将第一个元素设为最大、最小值,遍历数组逐个比对更新。php

functiongetMaxMin(array$arr):array

{

//过滤空数组

if(empty($arr)){

return[];

}

$max=$min=$arr[0];

foreach($arras$val){

if($val>$max){

$max=$val;

}

if($val<$min){

$min=$val;

}

}

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

}

//测试

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

print_r(getMaxMin($numArr));

//输出:Array([max]=>9[min]=>1)3.二维数组根据指定字段排序题目场景:业务高频场景,用户列表、商品列表排序,实现根据数组key升序/降序排序。解题思路:使用usort自定义排序规则,通过回调函数比对字段值。php

/**

*二维数组排序

*@paramarray$arr目标数组

*@paramstring$key排序字段

*@parambool$asc是否升序true升序false降序

*@returnarray

*/

functionarraySortByKey(array$arr,string$key,bool$asc=true):array

{

usort($arr,function($a,$b)use($key,$asc){

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

if($asc){

return$a[$key]>$b[$key]?1:-1;

}else{

return$a[$key]<$b[$key]?1:-1;

}

});

return$arr;

}

//测试数据

$userList=[

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

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

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

];

//按年龄升序

print_r(arraySortByKey($userList,'age'));4.两个有序数组合并为一个有序数组题目要求:传入两个升序数组,合并后返回新的升序数组,不使用sort等排序函数。解题思路:双指针算法,同时遍历两个数组,每次取较小值存入新数组,效率高于先合并后排序。php

functionmergeSortArray(array$arr1,array$arr2):array

{

$i=$j=0;

$newArr=[];

//双指针遍历比对

while($i<count($arr1)&&$j<count($arr2)){

if($arr1[$i]<=$arr2[$j]){

$newArr[]=$arr1[$i];

$i++;

}else{

$newArr[]=$arr2[$j];

$j++;

}

}

//补上剩余元素

while($i<count($arr1)){

$newArr[]=$arr1[$i];

$i++;

}

while($j<count($arr2)){

$newArr[]=$arr2[$j];

$j++;

}

return$newArr;

}

//测试

$a1=[1,3,5,7];

$a2=[2,4,6,8];

print_r(mergeSortArray($a1,$a2));

//输出:1,2,3,4,5,6,7,8三、经典排序算法(面试核心)1.冒泡排序算法原理:相邻元素两两比对,逆序则交换,每一轮遍历将最大值冒泡到末尾,时间复杂度O(n²)。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;

}

//测试

print_r(bubbleSort([3,1,4,2,5]));2.快速排序算法原理:选取基准值,将数组分为左右两部分(左小右大),递归排序左右子数组,平均时间复杂度O(nlogn),PHP面试最常考排序。php

functionquickSort(array$arr):array

{

$len=count($arr);

//递归终止条件:数组长度小于2直接返回

if($len<=1){

return$arr;

}

//选取基准值

$mid=$arr[0];

$left=$right=[];

//遍历拆分数据

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

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

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

}else{

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

}

}

//递归合并

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

}

//测试

print_r(quickSort([6,2,8,1,9,3]));四、递归算法面试题1.递归实现斐波那契数列题目描述:斐波那契数列:1,1,2,3,5,8...前两位为1,从第三位开始,每一位等于前两位之和。php

//递归获取第n位斐波那契数

functionfib(int$n):int

{

if($n==1||$n==2){

return1;

}

returnfib($n-1)+fib($n-2);

}

//输出前10位斐波那契数列

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

echofib($i).'';

}

//输出:112358132134552.递归遍历多维数组业务场景:无限级分类、嵌套菜单遍历,PHP后端高频递归场景。php

//递归输出多维数组所有值

functiontraverseArr(array$arr):void

{

foreach($arras$val){

if(is_array($val)){

//是数组则递归遍历

traverseArr($val);

}else{

echo$val.'';

}

}

}

//测试多维数组

$testArr=[1,[2,3],4,[5,[6,7]]];

traverseArr($testArr);

//输出:1234567五、逻辑算法面试真题1.青蛙跳台阶问题题目:一只青蛙一次可以跳1级或2级台阶,求跳上n级台阶共有多少种跳法。思路分析:经典递推问题。n级台阶的跳法=最后一步跳1级的跳法+最后一步跳2级的跳法,公式:f(n)=f(n-1)+f(n-2),和斐波那契数列逻辑一致。php

functionjumpStep(int$n):int

{

if($n==1)return1;

if($n==2)return2;

returnjumpStep($n-1)+jumpStep($n-2);

}

echojumpStep(5);//输出82.有序数组查找目标值(二分查找)题目:在升序有序数组中,快速查找目标值,返回下标,不存在返回-1。算法优势:二分查找时间复杂度O(logn),远优于遍历查找,是面试必考查找算法。php

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

{

$left=0;

温馨提示

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

评论

0/150

提交评论