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 相关文章推荐
php $_ENV为空的原因分析
Jun 01 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
destoon调用自定义模板及样式的公告栏
Jun 21 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php筛选不存在的图片资源
Apr 28 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
PHP面向对象程序设计OOP继承用法入门示例
Dec 27 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
PHP filesize函数用法浅析
Feb 15 PHP
Laravel+Intervention实现上传图片功能示例
Jul 09 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
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
php数组去重实例及分析
2013/11/26 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
酒店出纳岗位职责
2013/12/29 职场文书
集团薪酬管理制度
2014/01/13 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
小学母亲节活动总结
2015/02/10 职场文书
经费申请报告范文
2015/05/18 职场文书
宪法宣传标语100条
2019/10/15 职场文书
MySql数据库触发器使用教程
2022/06/01 MySQL
python实现学生信息管理系统(面向对象)
2022/06/05 Python