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

时间:2022-08-24 15:23:09

操作文件

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?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的相对路径是什么?

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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?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描述冒泡排序和快速排序,对象可以是一个数组

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?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描述顺序查找和二分查找

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?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内置函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
 * 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参数