PHP的文件操作与算法实现的面试题示例


Posted in PHP onAugust 10, 2015

操作文件

1.使用5种以上的方式获取一个文件的扩展名

要求: dir/upload.image.jpg, 找出.jpg或者jpg

<?php 
  /** 
   * 五种方式获取指定路径的文件扩展名 
   */ 
   
  $str = "dir/upload.image.jpg"; 
   
  function one ($str) 
  { 
    $arr = explode('.', $str); 
    $count = count($arr); 
     
    return $arr[$count - 1]; 
  } 
   
  function two ($str) 
  { 
    $len = strlen($str); 
     
    for ($i = $len - 1, $name = ''; $str[$i] != '.'; $i --) { 
      $name .= $str[$i]; 
    } 
    $name = strrev($name); 
     
    return $name; 
  } 
   
  function three($str) 
  { 
    $path = pathinfo($str); 
     
    return $path['extension']; 
  }  
   
  function four($str) 
  { 
    $arr = explode('.', $str); 
     
    return array_pop($arr); 
  } 
   
  function five($str) 
  { 
    $start = strrpos($str, '.'); 
     
    return substr($str, $start + 1); 
  } 
   
  echo one($str); 
  echo "<br>"; 
   
  echo two($str); 
  echo "<br>"; 
   
  echo three($str); 
  echo "<br>"; 
   
  echo four($str); 
  echo "<br>"; 
   
  echo five($str); 
  echo "<br>";

2.写一个php函数算出两个文件的相对路径。例如$a="/a/b/c/d/e.php"; $b="/a/b/12/34/c.php",B相对于A的相对路径是什么?

这道题目可以看成是求第一个公共节点的题目,网上流传的代码大部分是错的,考虑不周全,当然我这个也只是用“../”去表示,没用"./"

 

<?php 
   
  /** 
   * 求$b相对于$a的相对路径 
   * @param string $a 
   * @param string $b 
   * @return string 
   */ 
  function getRelativePath ($a, $b) 
  { 
    $patha = explode('/', $a); 
    $pathb = explode('/', $b); 
     
    $counta = count($patha) - 1; 
    $countb = count($pathb) - 1; 
     
    $path = "../"; 
    if ($countb > $counta) { 
      while ($countb > $counta) { 
        $path .= "../"; 
        $countb --; 
      } 
    } 
     
    // 寻找第一个公共结点 
    for ($i = $countb - 1; $i >= 0;) { 
      if ($patha[$i] != $pathb[$i]) { 
        $path .= "../"; 
        $i --; 
      } else { // 判断是否为真正的第一个公共结点,防止出现子目录重名情况 
        for ($j = $i - 1, $flag = 1; $j >= 0; $j --) { 
          if ($patha[$j] == $pathb[$j]) { 
            continue; 
          } else { 
            $flag = 0; 
            break; 
          } 
        } 
         
        if ($flag) 
          break; 
        else 
          $i ++; 
      } 
    } 
     
    for ($i += 1; $i <= $counta; $i ++) { 
      $path .= $patha[$i] . "/"; 
    } 
     
    return $path; 
  } 
   
  $a = "/a/c/d/e.php"; 
  $b = "/a/c.php"; 
   
  $path = getRelativePath($a, $b); 
  echo $path;

算法

1.使用PHP描述冒泡排序和快速排序,对象可以是一个数组

<?php 
   
  /** 
   * 冒泡排序算法实现(从小到大) 
   */ 
  function maopaoSort (&$array) 
  { 
    $count = count($array); 
     
    for ($i = 0; $i < $count - 1; $i ++) { 
      for ($j = 0; $j < $count - $i - 1; $j ++) { 
        if ($array[$j] > $array[$j + 1]) { 
          $tmp = $array[$j]; 
          $array[$j] = $array[$j + 1]; 
          $array[$j + 1] = $tmp; 
        } 
      } 
    } 
  } 
   
  /** 
   * 快速排序 
   */ 
  function pivotParation (&$array, $start, $end) 
  { 
    $stand = $array[$start]; 
     
    while ($start < $end) { 
      while ($start < $end && $array[$end] >= $stand) { 
        $end --; 
      } 
      if ($start < $end) { 
        $array[$start ++] = $array[$end]; 
      } 
       
      while ($start < $end && $array[$start] <= $stand) { 
        $start ++; 
      } 
      if ($start < $end) { 
        $array[$end --] = $array[$start]; 
      } 
    } 
     
    $array[$start] = $stand; 
     
    return $start; 
  } 
   
  function quickSort (&$array, $begin, $end) 
  { 
    if ($begin < $end) { 
      $pivot = pivotParation($array, $begin, $end); 
      quickSort($array, $begin, $pivot - 1); 
      quickSort($array, $pivot + 1, $end); 
    } 
  } 
   
  $arr = array( 
      5, 
      1, 
      3, 
      2, 
      19, 
      11, 
      25, 
      12, 
      100, 
      10000, 
      12 
  ); 
   
  // 冒泡排序 
  maopaoSort($arr); 
  print_r($arr); 
  echo "<br>"; 
   
  // 快速排序 
  $count = count($arr); 
  quickSort($arr, 0, $count - 1); 
  print_r($arr);

2.使用php描述顺序查找和二分查找

<?php 
   
  /** 
   * 顺序查找 
   */ 
  function seqSearch ($arr, $needle) 
  { 
    for ($i = 0, $len = count($arr); $i < $len; $i ++) { 
      if ($arr[$i] == $needle) { 
        return $i; 
      } 
    } 
    return - 1; 
  } 
   
  /** 
   * 二分查找 
   */ 
  function midSearch ($arr, $start, $end, $needle) 
  { 
    while ($start <= $end) { 
      $mid = (int)($start + ($end - $start) / 2); // 防止超出整数表示范围 
       
      if ($arr[$mid] == $needle) { 
        return $mid; 
      } else if ($arr[$mid] > $needle) { 
        $end = $mid - 1; 
      } else { 
        $start = $mid + 1; 
      } 
    } 
     
    return - 1; 
  } 
   
  $arr = array( 
      1, 
      2, 
      3, 
      4, 
      5, 
      6, 
      7, 
      8, 
      9, 
      10 
  ); 
   
  $needle = 5; 
   
  echo seqSearch($arr, $needle); 
  echo "<br>"; 
   
  echo midSearch($arr, 0, count($arr) - 1, $needle);

3.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

/** 
   * Description:获取中枢点的位置 
   * 
   * @param array $array       
   * @param int $left       
   * @param int $right       
   * @param string $field       
   * @return int 
   */ 
  function fetchArrayPivot (&$array, $left, $right, $field) 
  { 
    // 基准定义 
    $stand = $array[$left]; 
     
    // 遍历数组 
    while ($left < $right) { 
      while ($left < $right && $array[$right][$field] >= $stand[$field]) { 
        $right --; 
      } 
      if ($left < $right) { 
        $array[$left ++] = $array[$right]; 
      } 
       
      while ($left < $right && $array[$left][$field] <= $stand[$field]) { 
        $left ++; 
      } 
      if ($left < $right) { 
        $array[$right --] = $array[$left]; 
      } 
    } 
     
    // 获取中枢点位置 
    $array[$left] = $stand; 
     
    return $left; 
  } 
   
  /** 
   * Description:快速排序主程序 
   * 
   * @param array $array       
   * @param int $begin       
   * @param int $end       
   * @param string $field       
   */ 
  function quickSort (&$array, $begin, $end, $field) 
  { 
    // 变量定义 
    $pivot = null; 
     
    if ($begin < $end) { 
      $pivot = fetchArrayPivot($array, $begin, $end, $field); 
      quickSort($array, $begin, $pivot - 1, $field); 
      quickSort($array, $pivot + 1, $end, $field); 
    } 
  }

利用快排的思想,增加一个field参数

PHP 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
php模拟ping命令(php exec函数的使用方法)
Oct 25 PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 PHP
PHP与Perl之间知识点区别整理
Mar 19 PHP
在laravel中实现事务回滚的方法
Oct 10 PHP
laravel请求参数校验方法
Oct 10 PHP
Yii框架where查询用法实例分析
Oct 22 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
Oct 24 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
PHP的关于变量和日期处理的一些面试题目整理
Aug 10 #PHP
6个超实用的PHP代码片段
Aug 10 #PHP
解读PHP中的垃圾回收机制
Aug 10 #PHP
php实现多城市切换特效
Aug 09 #PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 #PHP
PHP实现获取文件后缀名的几种常用方法
Aug 08 #PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 #PHP
You might like
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
php结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
修改发贴的编辑功能
2007/03/07 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
解决DataFrame排序sort的问题
2018/06/07 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
python程序 创建多线程过程详解
2019/09/23 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
遇到的Mysql的面试题
2014/06/29 面试题
大学生自我鉴定
2013/12/08 职场文书
施工资料员的岗位职责
2013/12/22 职场文书
老人祝寿主持词
2014/03/28 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
教师考核表个人总结
2015/02/12 职场文书
2019个人工作总结
2019/06/21 职场文书
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android