PHP面试常用算法

  一、冒泡排序

  基本思想:

    对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。

  //冒泡排序

 1 <?php
 2
 3     function mysort($arr)
 4     {
 5         for($i = 0; $i < count($arr); $i++)
 6         {
 7             $isSort = false;
 8             for ($j=0; $j< count($arr) - $i - 1; $j++)
 9             {
10                 if($arr[$j] < $arr[$j+1])
11                 {
12                     $isSort = true;
13                     $temp = $arr[$j];
14                     $arr[$j] = $arr[$j+1];
15                     $arr[$j+1] = $temp ;
16                 }
17             }
18             if($isSort)
19             {
20                 break;
21             }
22         }
23         return $arr;
24     }
25
26     $arr = array(3,1,2);
27     var_dump(mysort($arr));
28 ?>

  二、快速排序

  基本思想:

    在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。

  //快速排序

 1 <?php
 2     //快速排序
 3         function quick_sort($arr)
 4         {
 5             //先判断是否需要继续进行
 6             $length = count($arr);
 7             if($length <= 1)
 8             {
 9                 return $arr;
10             }
11
12             $base_num = $arr[0];//选择一个标尺  选择第一个元素
13
14             //初始化两个数组
15             $left_array = array();//小于标尺的
16             $right_array = array();//大于标尺的
17             for($i=1; $i<$length; $i++)
18             {            //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
19                 if($base_num > $arr[$i])
20                 {
21                     //放入左边数组
22                     $left_array[] = $arr[$i];
23                 }
24                 else
25                 {
26                     //放入右边
27                     $right_array[] = $arr[$i];
28                 }
29             }
30             //再分别对 左边 和 右边的数组进行相同的排序处理方式
31             //递归调用这个函数,并记录结果
32             $left_array = quick_sort($left_array);
33             $right_array = quick_sort($right_array);
34             //合并左边 标尺 右边
35             return array_merge($left_array, array($base_num), $right_array);
36         }
37
38         $arr = array(3,1,2);
39         var_dump(quick_sort($arr));
40
41 ?>

  

  三、二分查找

  基本思想:

    假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)

  //二分查找

 1 <?php
 2     //二分查找
 3     function bin_search($arr,$low,$high,$k)
 4     {
 5         if($low <= $high)
 6         {
 7             $mid = intval(($low + $high)/2);
 8             if($arr[$mid] == $k)
 9             {
10                 return $mid;
11             }
12             else if($k < $arr[$mid])
13             {
14                 return bin_search($arr,$low,$mid-1,$k);
15             }
16             else
17             {
18                 return bin_search($arr,$mid+1,$high,$k);
19             }
20         }
21         return -1;
22     }
23
24     $arr = array(1,2,3,4,5,6,7,8,9,10);
25
26     print(bin_search($arr,0,9,3));
27 ?>

  四、顺序查找

  基本思想:

    从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。

    //顺序查找 

 1 <?php
 2     //顺序查找
 3     function seq_search($arr,$n,$k)
 4     {
 5         $array[$n] = $k;
 6         for($i = 0;$i < $n; $i++)
 7         {
 8             if($arr[$i] == $k)
 9             {
10                 break;
11             }
12         }
13
14         if($i < $n)
15         {
16             return $i;
17         }
18         else
19         {
20             return -1;
21         }
22     }
23 ?>

  

  五、写一个函数,能够遍历一个文件下的所有文件和子文件夹

 1 <?php
 2     function my_scandir($dir)
 3     {
 4         $files = array();
 5         if($handle = opendir($dir))
 6         {
 7             while (($file = readdir($handle))!== false)
 8             {
 9                 if($file != ‘..‘ && $file != ‘.‘)
10                 {
11                     if(is_dir($dir."/".$file))
12                     {
13                         $files[$file]=my_scandir($dir."/".$file);
14                     }
15                     else
16                     {
17                         $files[] = $file;
18                     }
19                 }
20             }
21
22             closedir($handle);
23             return $files;
24         }
25     }
26
27     var_dump(my_scandir(‘../‘));
28 ?>

  

  六、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名

 1 <?php
 2     function getExt($url)
 3     {
 4         $arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
 5         //‘scheme‘ => string ‘http‘ (length=4)
 6         //‘host‘ => string ‘www.sina.com.cn‘ (length=15)
 7         //‘path‘ => string ‘/abc/de/fg.php‘ (length=14)
 8         //‘query‘ => string ‘id=1‘ (length=4)
 9         $file = basename($arr[‘path‘]);// basename函数返回路径中的文件名部分
10         $ext = explode(‘.‘, $file);
11         return $ext[count($ext)-1];
12     }
13
14     print(getExt(‘http://www.sina.com.cn/abc/de/fg.html.php?id=1‘));
15
16 ?>

  

  七、实现中文字符串截取无乱码的方法

    可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

  

时间: 2025-01-07 02:37:19

PHP面试常用算法的相关文章

面试常用算法总结——排序算法(java版)

排序算法 重要性不言而喻,很多算法问题往往选择一个好的排序算法往往问题可以迎刃而解 1.冒泡算法 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端.也就是双重循环就可以搞定的问题但是需要注意下一边界 算法步骤: 1)比较相邻的元素.如果第一个比第二个大,

面试常用算法之排序(1)

package algorithm.sort; /** * @Auther: AaronPi * @Date: 2019-4-27 23:01 * @Description: * 稳定性:待排序的序列中有想等值得元素排序后元素之间原有的先后顺序不变 * 原地排序算法:特指空间复杂度为O(1)的排序算法 */ public class BaseSort { /** * 冒泡排序:最多排序n次能出结果,第一次排序能找到最大数放在最后, * 如此反复第k次排序能找到排第k大的数,所以每次排序对前n-k

面试常用算法之排序(2)

归并排序 package algorithm.sort; /** * @Auther: AaronPi * @Date: 2019-5-6 21:32 * 归并排序 * 思想:(分治法->用递归来实现)把数组从中间分成两部分,分别排序,再组合在一起 * 思路很巧妙,需要尤其注意边界条件.判断剩余元素等事项 */ public class MergeSort { // 归并排序算法, a是数组,n表示数组大小 public static void mergeSort(int[] a, int n)

PHP面试常用算法(推荐)

一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. //冒泡排序 <?php function mysort($arr) { for($i = 0; $i < count($arr); $i++) { $isSort = false; for ($j=0; $j< count($arr) - $i - 1; $j++) { if($arr[$

面试常用算法之排序(3)

快速排序 package algorithm.sort; /** * 快速排序 * 思想:类似于归并排序,但是不同于归并排序每次排序寻找一次子数组中点的是,寻找一个更恰当的分区点 * * @Author 28370 * @Date 2019-5-13 **/ public class QuickSort { public static void main(String[] args) { int[] a= {1,7,4,8,5,3,9,2}; quickSort(a); for (int i =

面试高级算法梳理笔记

面试高级算法梳理笔记 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系列,旨在: 梳理算法逻辑 探索优化思路 深入代码细节 1.2 目录 原文首发于个人博客Jennica.Space,按算法难度划分为初中高三个级别,详细目录及链接如下: 初级篇 穷竭搜索 贪心 动态规划 数据结构 图论 数论 中级篇 二分搜索 常用技巧 数据结构(二) 动态规划(二) 网络流 计算几何 高级篇 数论(二) 博弈论 图论(二) 常用技巧(二) 智慧搜索 分治 字符串 1.3 题解 配套习题及详解同步发

【常用算法思路分析系列】排序高频题集

最近在牛客上整理常用的一些算法思路,[常用算法思路分析系列]主要是针对一些高频算法笔试.面试题目的解题思路进行总结,大部分也给出了具体的代码实现,本篇文章是对排序相关题目的思路分析. 1.简单分类 首先对一些常用算法按空间复杂度进行分类如下: O(1): 冒泡排序.选择排序.插入排序.希尔排序.堆排序 O(logN)~O(N): 快速排序 O(N): 归并排序 O(M): 计数排序.基数排序 2.对一个基本有序的有序的数组排序,选择哪种排序算法? 基本有序:指如果把数组排好序的话,每个元素移动的

五大常用算法

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)-- 任何一个可以用计

推荐系统中常用算法 以及优点缺点对比

推荐系统中常用算法 以及优点缺点对比 在 推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器