版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年氧化锆纤维行业洞察报告及未来五至十年发展趋势报告
- 瓷砖的全年营销方案(3篇)
- 电杆垂直度施工方案(3篇)
- 盐业公司拜年活动方案策划(3篇)
- 码头趸船防汛应急预案(3篇)
- 福建媒体活动策划方案范文(3篇)
- 简单文娱活动策划方案(3篇)
- 红酒营销渠道策划方案(3篇)
- 绿色户外动物活动方案策划(3篇)
- 老年餐饮营销方案策划(3篇)
- 2026年楼宇智能化高级工程师招聘笔试试卷 招录11人
- 2026年云天化集团有限责任公司人员招聘笔试参考试题及详细答案解析
- PIC-S PI 006-4 确认与验证新规全解读(2026版GMP验证实施指南)
- 2026年摩托车三力测试模拟试题(附答案)
- 2026年国际汉语教师证书考试全真题库(含答案解析笔试+面试完整版)
- 新疆交通投资集团有限责任公司笔试题目
- 2026小红书商业服饰潮流行业情绪白皮书
- 2026年财务共享中心运维人员理论题库及完整答案
- 2026年河南省考《申论》真题及答案解析(省市卷)
- 党校培训考试题及答案2024
- DZ∕T 0339-2020 矿床工业指标论证技术要求(正式版)
评论
0/150
提交评论