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下几种删除目录的方法总结
Aug 19 PHP
一些被忽视的PHP函数(简单整理)
Apr 30 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
php遍历数组的方法分享
Mar 22 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 PHP
php网站地图生成类示例
Jan 13 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
php实现的CSS更新类实例
Sep 22 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
php获取汉字拼音首字母的方法
Oct 21 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
基于php判断客户端类型
Oct 14 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
Adodb的十个实例(清晰版)
2006/12/31 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
PHP 图片处理
2020/09/16 PHP
为Extjs加加速(javascript加速)
2010/08/19 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
详解Python编程中包的概念与管理
2015/10/16 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
Python切片操作深入详解
2018/07/27 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
Weblogic和WebSphere不同特点
2012/05/09 面试题
初中科学教学反思
2014/01/21 职场文书
学雷锋宣传标语
2014/06/25 职场文书
个性与发展自我评价
2015/03/06 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python