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

操作文件

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参数

(0)

相关推荐

  • PHP面试常用算法(推荐)

    一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. //冒泡排序 <?php function mysort($arr) { for($i = 0; $i < count($arr); $i++) { $isSort = false; for ($j=0; $j< count($arr) - $i - 1; $j++) { if($arr[$

  • 33道php常见面试题及答案

    1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中:而链接到当前页面的URL记录在预定义变量(2)中. 复制代码 代码如下: 答:echo $_SERVER['PHP_SELF']; echo $_SERVER["HTTP_REFERER"]; 2.执行程序段将输出(3). 复制代码 代码如下: 答:0 3.在HTTP 1.0中,状态码 401 的含义是(4):如果返回"找不到文件"的提示,则可用 header 函数,其语句为(5).

  • PHP面试题之文件目录操作

    这道题其实并不难,考点主要在函数substr() strrchr()  array_pop()  strrpos() strpos() strrev() explode()  pathinfo(). 废话不多说了,直接给大家贴代码了. 获取文件后缀,遍历目录层次 /** * 5种方式获取文件后缀名 * 这道题其实就是考函数substr() strrchr() array_pop() strrpos() strpos() strrev() explode() pathinfo() * @param

  • PHP的关于变量和日期处理的一些面试题目整理

    变量相关 PHP变量的内部实现 编程语言的系统类型分为强类型和弱类型两种: 强类型语言是一旦某个变量被申明为某个类型的变量,在程序运行过程中,就不能将该变量的类型以外的值赋予给它,c/c++/java等语言就属于这类 php及ruby,javascript等脚本语言就属于弱类型语言:一个变量可以表示任意的数据类型 php变量类型及存储结构 php在声明或使用变量的时候,并不需要显式指明其数据类型 php是弱类型语言,这不并表示php没有类型,在php中,存在8种变量类型,可以分为三类: 标量类型

  • PHP经典面试题集锦

    本文较为详细的分析了PHP经典面试题.分享给大家供大家参考.具体如下: 做了一下网络上的php题目,不知不觉做到现在.....把答案贴出来,供参考之用. 1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) $a = date("Y-m-d H:i:s", strtotime("-1 day")); print_r($a); 2.echo(),print(),print_r()的区别(3分) echo 和print不是一个函数,是一个语言

  • 8个PHP数组面试题

    网上找的PHP数组题,准备自己做一遍并且记录下来. 1.写函数创建长度为10的数组,数组中的元素为递增的奇数,首项为1. 复制代码 代码如下: <?php function arrsort($first,$length){ $arr = array();         for($i=$first;$i<=$length;$i++){ $arr[] = $i*2-1;         }         return $arr;     } $arr1 = arrsort(1,10);    

  • PHP经典面试题之设计模式(经常遇到)

    设计模式在面试过程中经常会提到,有时候还会让我们举例说明各种设计模式的应用场景. 使用设计模式可以减轻我们的工作量,优化我们的代码. 设计模式非常的多,这里介绍单例模式,工厂模式,组合模式,策略模式4种模式 如果有代码有什么问题或者有更好的方式请告知,谢谢!!!!! /** * 单例模式 * @author YangYang <1812271619@qq.com> * 可以想成在一次http请求中只产生该类的一个对象(即只new classname一次) * 经典的例子是数据库连接(redis

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

    操作文件 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 ($s

  • Python使用文件操作实现一个XX信息管理系统的示例

    写在前面 大家好,我是第一次python学了一个学期,期末要完成一个毕业生信息管理系统大作业的小韩了,由于上次没有仔细看开发实现的要求,实现了一个简单的毕业生信息管理系统,而这次专门整理了两种使用文件进行保存数据实现的毕业生信息管理系统,因为是第一次学python,还不太熟悉python的写法, 而之前是学 c .c++,感觉我的这个写的有一股 c/c++的内味: 1. 使用excel .xlsx 保存数据实现一个毕业生信息管理系统2. 使用文本文档.txt保存数据实现一个毕业生信息管理系统 以

  • C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    本文实例讲述了C#实现的文件操作封装类.分享给大家供大家参考,具体如下: 最近发现群共享里面有个C# 文件操作封装类,其方法是调用Windows API 来操作的文件的删除.移动.复制.重命名操作.下载下来一试,发现果然不错,特在此记录,以防丢失! 文件操作类代码如下: using System; using System.Runtime.InteropServices; using System.IO; namespace LxFile { /// <summary> /// 文件操作代理,

  • Node.js本地文件操作之文件拷贝与目录遍历的方法

    文件拷贝 NodeJS 提供了基本的文件操作 API,但是像文件拷贝这种高级功能就没有提供,因此我们先拿文件拷贝程序练手.与 copy 命令类似,我们的程序需要能接受源文件路径与目标文件路径两个参数. 小文件拷贝 我们使用 NodeJS 内置的 fs 模块简单实现这个程序如下. var fs = require('fs'); function copy(src, dst) { fs.writeFileSync(dst, fs.readFileSync(src)); } function main

  • C#实现的Excel文件操作类实例

    本文实例讲述了C#实现的Excel文件操作类.分享给大家供大家参考,具体如下: using System; using System.Data; using System.Data.OleDb; using System.Text; using System.IO; namespace Hxh.API { /// <summary> /// ExcelOpration 的摘要说明. /// </summary> public class ExcelOpration { OleDbC

  • C#实现的基于二进制读写文件操作示例

    本文实例讲述了C#实现的基于二进制读写文件操作.分享给大家供大家参考,具体如下: using System; using System.IO; class MyStream { private const string FILE_NAME = "Test.data"; public static void Main(String[] args) { // Create the new, empty data file. if (File.Exists(FILE_NAME)) { Con

  • Python实现的读取文件内容并写入其他文件操作示例

    本文实例讲述了Python实现的读取文件内容并写入其他文件操作.分享给大家供大家参考,具体如下: 文件目录结构,如图: read_file.py是工作文件,file_test.py是读取文件源,write_test.py是写入目标文件. 文件A:file_test.py #coding=utf-8 for i in range(1, 10): print i 文件B:read_file.py # coding=utf-8 # 打开件A f = open('./file_test.py', 'rb

  • Python实现爬取亚马逊数据并打印出Excel文件操作示例

    本文实例讲述了Python实现爬取亚马逊数据并打印出Excel文件操作.分享给大家供大家参考,具体如下: python大神们别喷,代码写的很粗糙,主要是完成功能,能够借鉴就看下吧,我是学java的,毕竟不是学python的,自己自学看了一点点python,望谅解. #!/usr/bin/env python3 # encoding=UTF-8 import sys import re import urllib.request import json import time import zli

  • python 读写excel文件操作示例【附源码下载】

    本文实例讲述了python 读写excel文件操作.分享给大家供大家参考,具体如下: 对excel文件的操作,python有第三方的工具包支持,xlutils,在这个工具包中包含了xlrd,xlwt等工具包.利用这些工具,可以方便的对excel 进行操作. 1. 下载 xlutils : http://pypi.python.org/pypi/xlutils 2. 安装,解压下载文件之后,可以 python setup.py install 3. 应用(生成EXCEL,遍历EXCEL,修改EXC

  • Java RandomAccessFile基本文件操作示例

    本文实例讲述了Java RandomAccessFile基本文件操作.分享给大家供大家参考,具体如下: 一 简介 RandomAccessFile:java提供对文件内容的访问,既可以读文件,也可以写文件. RandomAccessFile支持随机访问文件,可以访问文件的任意位置 1.java文件模型 在硬盘上的文件是byte byte byte存储的,是数据的集合 2.打开文件 有两种模式"rw"(读写) "r"(只读) RandomAccessFile raf

随机推荐