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 相关文章推荐
初探PHP5
Oct 09 PHP
一个简单的自动发送邮件系统(二)
Oct 09 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
php中文验证码实现示例分享
Jan 12 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
PHP中iconv函数知识汇总
Jul 02 PHP
修改Laravel5.3中的路由文件与路径
Aug 10 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 PHP
PHP构造二叉树算法示例
Jun 21 PHP
Yii框架响应组件用法实例分析
Sep 04 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 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
是否存在第一台收音机的说法
2021/03/01 无线电
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
JS前端笔试题分析
2016/12/19 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
js操作二进制数据方法
2018/03/03 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
python获得一个月有多少天的方法
2015/06/04 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
python requests 使用快速入门
2017/08/31 Python
python的pip安装以及使用教程
2018/09/18 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
Python爬虫开发与项目实战
2020/12/16 Python
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
美国礼品卡商城: Gift Card Mall
2017/08/25 全球购物
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
企业宣传工作方案
2014/06/02 职场文书
关于学习的决心书
2015/02/05 职场文书
2015年调度员工作总结
2015/04/30 职场文书
会议新闻稿
2015/07/17 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
作文之亲情600字
2019/09/23 职场文书
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技