分享一些算法

1. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
    $url = "http://www.linhongyou.com/abc/de/fg.php?id=1";
    $path = parse_url($url);
    echo pathinfo($path['path'],PATHINFO_EXTENSION);

2.在 HTML 语言中,页面头部的 meta 标记可以用来输出文件的编码格式,以下是一个标准的 meta 语句
 < META http-equiv='Content-Type' content='text/html; charset=gbk'> 
 请使用 PHP 语言写一个函数,把一个标准 HTML 页面中的类似 meta 标记中的 charset 部分值改为 big5 
 请注意: 
     (1) 需要处理完整的 html 页面,即不光此 meta 语句 
     (2) 忽略大小写 
     (3) ' 和 " 在此处是可以互换的 
     (4) 'Content-Type' 两侧的引号是可以忽略的,但 'text/html; charset=gbk' 两侧的不行 
     (5) 注意处理多余空格 

  $html = "<html><head><META http-equiv='Content-Type' content='text/html; charset=gbk'> 
           </head></html>"; 
  $pattern = "/<meta\s+http-equiv=(\'|\")?Content-Type(\'|\")?\s+ 
           content=(\'|\")?text\/html;\s+charset=([a-z0-9_\-]*)(\'|\")?>/i"; 
  $replase = "<META http-equiv='Content-Type' content='text/html; charset=big5'>"; 
  $html = preg_replace($pattern,$replase,$html); 
  echo htmlspecialchars($html); 
3.写一个函数,算出两个文件的相对路径
  $a = '/a/b/1/2/3/4/c/d/e.php';
  $b = '/a/b/13/34/c.php';
  function getrelativepath($a,$b){
    $a_arr = explode('/',$a);
    $b_arr = explode('/',$b);
    $path = '';
    $back_path = '';
    for($i=0;$i<count($a_arr)-1;$i++){
        $back_path .= isset($b_arr[$i])&&$b_arr[$i]==$a_arr[$i]?'':'../';
    }
    for($i=1;$i<count($b_arr)-1;$i++){
        $path .= isset($a_arr[$i])&&$a_arr[$i]==$b_arr[$i]?'':$b_arr[$i].'/';
    }
    return $back_path.$path;
  }
  echo getrelativepath($b,$a);

4.遍历文件夹
  function dirlist($dir){
    if($haddel = opendir($dir)){
        while($file = readdir($haddel)){
            if($file=='.'||$file=='..') continue;
            if(is_dir($subdir = realpath($dir.'/'.$file))){
                echo $subdir.'<br/>';
                dirlist($subdir);
            }else{
                echo $dir.'/'.$file.'<br/>';
            }
        }
        closedir($haddel);
    }
  }
  dirlist('D:/server/nginx/');

5.快速排序
  $arr = [6,2,7,0,4,5,8,1,10,9,3];
  function quick_sort($arr){
    if(count($arr)<2)
        return $arr;
    $k = $arr[0];
    $left = array();
    $right = array();
    for($i=1;$i<count($arr);$i++){
        if($arr[$i]<$k){
            $left[]=$arr[$i];
        }else{
            $right[]=$arr[$i];
        }
    }
    $left = quick_sort($left);
    $right = quick_sort($right);
    return array_merge($left,array($k),$right);
  }
  print_r($arr);
  $arr = quick_sort($arr);
  print_r($arr);

6.二分法
  function erfenfa($arr,$vel){
    $len = count($arr);
    if($len==0) return -1;
    $start = 0;
    $end = $len-1;
    while($start<=$end){
        $middle = floor(($start+$end)/2);
        if($arr[$middle]>$vel){
            $end = $middle-1;
        }elseif($arr[$middle]<$vel){
            $start = $middle+1;
        }else{
            return $middle;
        }
    }
    return -1;
  }
  echo erfenfa($arr,3);

7.n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局, 
 再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王. 约瑟夫算法
  function monkeyKing($n, $m) {    //$n为猴子总数,$m为剔除猴子步长
          $s = 0;    //$s为大王坐标,只有一只猴子时,大王坐标为0
          for($i = 2; $i <= $n; $i++) {    //依次向后递推,求到共有$n只猴子,剔除步长为$m时的大王坐标
              $s = ($s + $m) % $i;    //大王坐标递推公式
          }
          return $s;
      }
  echo monkeyKing(6, 2);
8.多进程写文件
  function write_file($filename, $content)
  {
    $lock = $filename . '.lck';
    $write_length = 0;
    while(true) {
        if( file_exists($lock) ) {
            usleep(100);
        } else {
            touch($lock);
            $write_length = file_put_contents($filename, $content, FILE_APPEND);
            break;
        }
    }
    if( file_exists($lock) ) {
        unlink($lock);
    }
    return $write_length;
  }
Tagged on:

8 thoughts on “分享一些算法

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*