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[$j] < $arr[$j+1])
        {
          $isSort = true;
          $temp = $arr[$j];
          $arr[$j] = $arr[$j+1];
          $arr[$j+1] = $temp ;
        }
      }
      if($isSort)
      {
        break;
      }
    }
    return $arr;
  }

  $arr = array(3,1,2);
  var_dump(mysort($arr));
?>

二、快速排序

基本思想:

在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。

//快速排序

<?php
  //快速排序
    function quick_sort($arr)
    {
      //先判断是否需要继续进行
      $length = count($arr);
      if($length <= 1)
      {
        return $arr;
      }

      $base_num = $arr[0];//选择一个标尺 选择第一个元素

      //初始化两个数组
      $left_array = array();//小于标尺的
      $right_array = array();//大于标尺的
      for($i=1; $i<$length; $i++)
      {      //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
        if($base_num > $arr[$i])
        {
          //放入左边数组
          $left_array[] = $arr[$i];
        }
        else
        {
          //放入右边
          $right_array[] = $arr[$i];
        }
      }
      //再分别对 左边 和 右边的数组进行相同的排序处理方式
      //递归调用这个函数,并记录结果
      $left_array = quick_sort($left_array);
      $right_array = quick_sort($right_array);
      //合并左边 标尺 右边
      return array_merge($left_array, array($base_num), $right_array);
    }

    $arr = array(3,1,2);
    var_dump(quick_sort($arr));

?>

三、二分查找

基本思想:

假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)

//二分查找

<?php
  //二分查找
  function bin_search($arr,$low,$high,$k)
  {
    if($low <= $high)
    {
      $mid = intval(($low + $high)/2);
      if($arr[$mid] == $k)
      {
        return $mid;
      }
      else if($k < $arr[$mid])
      {
        return bin_search($arr,$low,$mid-1,$k);
      }
      else
      {
        return bin_search($arr,$mid+1,$high,$k);
      }
    }
    return -1;
  }

  $arr = array(1,2,3,4,5,6,7,8,9,10);

  print(bin_search($arr,0,9,3));
?>
   

四、顺序查找

基本思想:

从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。

//顺序查找

<?php
  //顺序查找
  function seq_search($arr,$n,$k)
  {
    $array[$n] = $k;
    for($i = 0;$i < $n; $i++)
    {
      if($arr[$i] == $k)
      {
        break;
      }
    }

    if($i < $n)
    {
      return $i;
    }
    else
    {
      return -1;
    }
  }
?>
   

五、写一个函数,能够遍历一个文件下的所有文件和子文件夹

<?php
  function my_scandir($dir)
  {
    $files = array();
    if($handle = opendir($dir))
    {
      while (($file = readdir($handle))!== false)
      {
        if($file != ‘..‘ && $file != ‘.‘)
        {
          if(is_dir($dir."/".$file))
          {
            $files[$file]=my_scandir($dir."/".$file);
          }
          else
          {
            $files[] = $file;
          }
        }
      }

      closedir($handle);
      return $files;
    }
  }

  var_dump(my_scandir(‘../‘));
?>
   

六、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名

<?php
  function getExt($url)
  {
    $arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
    //‘scheme‘ => string ‘http‘ (length=4)
    //‘host‘ => string ‘www.sina.com.cn‘ (length=15)
    //‘path‘ => string ‘/abc/de/fg.php‘ (length=14)
    //‘query‘ => string ‘id=1‘ (length=4)
    $file = basename($arr[‘path‘]);// basename函数返回路径中的文件名部分
    $ext = explode(‘.‘, $file);
    return $ext[count($ext)-1];
  }

  print(getExt(‘http://www.sina.com.cn/abc/de/fg.html.php?id=1‘));

?>
   

七、实现中文字符串截取无乱码的方法

可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

时间: 2024-10-04 06:15:17

PHP面试常用算法(推荐)的相关文章

面试常用算法总结——排序算法(java版)

排序算法 重要性不言而喻,很多算法问题往往选择一个好的排序算法往往问题可以迎刃而解 1.冒泡算法 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端.也就是双重循环就可以搞定的问题但是需要注意下一边界 算法步骤: 1)比较相邻的元素.如果第一个比第二个大,

面试常用算法之排序(1)

package algorithm.sort; /** * @Auther: AaronPi * @Date: 2019-4-27 23:01 * @Description: * 稳定性:待排序的序列中有想等值得元素排序后元素之间原有的先后顺序不变 * 原地排序算法:特指空间复杂度为O(1)的排序算法 */ public class BaseSort { /** * 冒泡排序:最多排序n次能出结果,第一次排序能找到最大数放在最后, * 如此反复第k次排序能找到排第k大的数,所以每次排序对前n-k

面试常用算法之排序(2)

归并排序 package algorithm.sort; /** * @Auther: AaronPi * @Date: 2019-5-6 21:32 * 归并排序 * 思想:(分治法->用递归来实现)把数组从中间分成两部分,分别排序,再组合在一起 * 思路很巧妙,需要尤其注意边界条件.判断剩余元素等事项 */ public class MergeSort { // 归并排序算法, a是数组,n表示数组大小 public static void mergeSort(int[] a, int n)

PHP面试常用算法

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

面试常用算法之排序(3)

快速排序 package algorithm.sort; /** * 快速排序 * 思想:类似于归并排序,但是不同于归并排序每次排序寻找一次子数组中点的是,寻找一个更恰当的分区点 * * @Author 28370 * @Date 2019-5-13 **/ public class QuickSort { public static void main(String[] args) { int[] a= {1,7,4,8,5,3,9,2}; quickSort(a); for (int i =

推荐系统中常用算法 以及优点缺点对比

推荐系统中常用算法 以及优点缺点对比 在 推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器

轻松看懂机器学习十大常用算法

轻松看懂机器学习十大常用算法 通过本篇文章可以对ML的常用算法有个常识性的认识,没有代码,没有复杂的理论推导,就是图解一下,知道这些算法是什么,它们是怎么应用的,例子主要是分类问题. 每个算法都看了好几个视频,挑出讲的最清晰明了有趣的,便于科普. 以后有时间再对单个算法做深入地解析. 今天的算法如下: 决策树 随机森林算法 逻辑回归 SVM 朴素贝叶斯 K最近邻算法 K均值算法 Adaboost 算法 神经网络 马尔可夫 1. 决策树 根据一些 feature 进行分类,每个节点提一个问题,通过

面试高级算法梳理笔记

面试高级算法梳理笔记 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系列,旨在: 梳理算法逻辑 探索优化思路 深入代码细节 1.2 目录 原文首发于个人博客Jennica.Space,按算法难度划分为初中高三个级别,详细目录及链接如下: 初级篇 穷竭搜索 贪心 动态规划 数据结构 图论 数论 中级篇 二分搜索 常用技巧 数据结构(二) 动态规划(二) 网络流 计算几何 高级篇 数论(二) 博弈论 图论(二) 常用技巧(二) 智慧搜索 分治 字符串 1.3 题解 配套习题及详解同步发

【常用算法思路分析系列】字符串高频题集

本文是[常用算法思路分析系列]的第二篇,分析字符串相关的高频题目.第一篇是关于排序相关的高频题,还没有看的同学请移步:[常用算法思路分析系列]排序高频题集 1.KMP字符匹配 对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同,即给定两棵二叉树的头结点A和B,请返回一个boolean值,代表A中是否存在一棵同构于B的子树.上述其实就是一个字符匹配的问题,我们将A.B两棵二叉树进行遍历,得到一个字符串,就是判断B串是否是A串的子串.而字符匹配常用的