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 相关文章推荐
十天学会php之第八天
Oct 09 PHP
上传多个文件的PHP脚本
Nov 26 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 PHP
nginx+php-fpm配置文件的组织结构介绍
Nov 07 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
php绘制圆形的方法
Jan 24 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
Dec 31 PHP
Yii中的cookie的发送和读取
Jul 27 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
Redis构建分布式锁
Mar 28 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 24 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中include()与require()的区别说明
2010/03/10 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
python分析nignx访问日志脚本分享
2015/02/26 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
python模块导入的细节详解
2018/12/10 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
wxPython实现列表增删改查功能
2019/11/19 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
远东集团网络工程师面试题
2014/10/20 面试题
医学检验专业大学生求职信
2013/11/18 职场文书
迎国庆横幅标语
2014/10/08 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
导游词欢迎词
2015/02/02 职场文书
李白故里导游词
2015/02/12 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android