PHP面试常用算法(推荐)


Posted in PHP onJuly 22, 2016

一、冒泡排序

基本思想:

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

//冒泡排序

<?php

  function mysort($arr)
  {
    for($i = 0; $i < count($arr); $i++)
    {
      $isSort = false;
      for ($j=0; $j< count($arr) - $i - 1; $j++) 
      {
        if($arr[$j] < $arr[$j+1])
        {
          $isSort = true;
          $temp = $arr[$j];
          $arr[$j] = $arr[$j+1];
          $arr[$j+1] = $temp ;
        }
      }
      if($isSort)
      {
        break;
      }
    }
    return $arr;
  }

  $arr = array(3,1,2);
  var_dump(mysort($arr));
?>

二、快速排序

基本思想:

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

//快速排序

<?php
  //快速排序
    function quick_sort($arr) 
    {
      //先判断是否需要继续进行
      $length = count($arr);
      if($length <= 1) 
      {
        return $arr;
      }
    
      $base_num = $arr[0];//选择一个标尺 选择第一个元素

      //初始化两个数组
      $left_array = array();//小于标尺的
      $right_array = array();//大于标尺的
      for($i=1; $i<$length; $i++) 
      {      //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
        if($base_num > $arr[$i]) 
        {
          //放入左边数组
          $left_array[] = $arr[$i];
        } 
        else 
        {
          //放入右边
          $right_array[] = $arr[$i];
        }
      }
      //再分别对 左边 和 右边的数组进行相同的排序处理方式
      //递归调用这个函数,并记录结果
      $left_array = quick_sort($left_array);
      $right_array = quick_sort($right_array);
      //合并左边 标尺 右边
      return array_merge($left_array, array($base_num), $right_array);
    }

    $arr = array(3,1,2);
    var_dump(quick_sort($arr));

?>

三、二分查找

基本思想:

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

//二分查找

<?php
  //二分查找
  function bin_search($arr,$low,$high,$k)
  {
    if($low <= $high)
    {
      $mid = intval(($low + $high)/2);
      if($arr[$mid] == $k)
      {
        return $mid;
      }
      else if($k < $arr[$mid])
      {
        return bin_search($arr,$low,$mid-1,$k);
      }
      else
      {
        return bin_search($arr,$mid+1,$high,$k);
      }
    }
    return -1;
  }

  $arr = array(1,2,3,4,5,6,7,8,9,10);

  print(bin_search($arr,0,9,3));
?>

四、顺序查找

基本思想:

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

//顺序查找 

<?php
  //顺序查找
  function seq_search($arr,$n,$k)
  {
    $array[$n] = $k;
    for($i = 0;$i < $n; $i++)
    {
      if($arr[$i] == $k)
      {
        break;
      }
    }

    if($i < $n)
    {
      return $i;
    }
    else
    {
      return -1;
    }
  }
?>

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

<?php  
  function my_scandir($dir)
  {
    $files = array();
    if($handle = opendir($dir))
    {
      while (($file = readdir($handle))!== false) 
      {
        if($file != '..' && $file != '.')
        {
          if(is_dir($dir."/".$file))
          {
            $files[$file]=my_scandir($dir."/".$file);
          }
          else
          {
            $files[] = $file;
          }
        }
      }

      closedir($handle);
      return $files;
    }
  }

  var_dump(my_scandir('../'));
?>

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

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

  print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));

?>

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

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

以上这篇PHP面试常用算法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 PHP
PHP获取一年有几周以及每周开始日期和结束日期
Aug 06 PHP
php通过smtp邮件验证登陆的方法
May 11 PHP
thinkphp关于简单的权限判定方法
Apr 03 PHP
PHP实现的MD5结合RSA签名算法实例
Oct 07 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
PHP7内核CGI与FastCGI详解
Apr 14 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
微信红包随机生成算法php版
Jul 21 #PHP
php集成动态口令认证
Jul 21 #PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
Jul 21 #PHP
微信随机生成红包金额算法php版
Jul 21 #PHP
PHP简单读取PDF页数的实现方法
Jul 21 #PHP
基于PHP微信红包的算法探讨
Jul 21 #PHP
php中preg_replace_callback函数简单用法示例
Jul 21 #PHP
You might like
新闻分类录入、显示系统
2006/10/09 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
DOM相关内容速查手册
2007/02/07 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
批处理与python代码混合编程的方法
2016/05/19 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Series和DataFrame使用简单入门
2019/11/13 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
大学生求职自我评价
2014/01/16 职场文书
美德好少年事迹材料
2014/01/19 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
葬礼主持词
2015/07/02 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
Golang的继承模拟实例
2021/06/30 Golang
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS
图文详解nginx日志切割的实现
2022/01/18 Servers