课程咨询 :18669403922 QQ:2720475033

济南php培训 > 达内新闻 > PHP面试常用算法分享
  • PHP面试常用算法分享

    发布:济南php培训      来源:济南php培训      时间:2016-08-26

  • 一、冒泡排序

    基本思想:

    对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。

    //冒泡排序

    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));

    ?>

    二、快速排序

    基本思想:

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

    //快速排序

    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大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)

    //二分查找

    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));

    ?>

    四、顺序查找

    基本思想:

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

    //顺序查找

    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; }

    }

    ?>

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

    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中取出文件的扩展名

    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”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

    推荐文章

上一篇:国外程序员整理的 PHP 资源大全分享

下一篇:【转】PHP漏洞全解(六)-跨网站请求伪造

最新开班日期  |  更多

PHP高级开发工程师就业班

PHP高级开发工程师就业班

开班日期:4月15日

PHP高级开发工程师周末班

PHP高级开发工程师周末班

开班日期:4月15日

PHP高级开发工程师就业班

PHP高级开发工程师就业班

开班日期:4月15日

PHP高级开发工程师周末班

PHP高级开发工程师周末班

开班日期:4月15日

  • 山大路中心地址:济南市历下区山大路47号数码港大厦A座102 电话:0531-55588120
    趵突泉中心地址:济南市历下区趵突泉北路三联商社八楼 电话:0531-55583636
    济宁中心地址:济宁市市中区太白路10号苏宁生活广场19层 电话:0537-5125585
  • 课程培训电话:18669403922 QQ:2720475033     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56