PHP部分常見算法


輸入一個1~1億的數字,打印中文,注意特殊情況
例如,輸入7,打印七,123打印一百二十三

<?php

$CN = array("零","一","二","三","四","五","六","七","八","九");
$UNIT = array(1=>"十","百","千","萬");

$str = $argv[1];
$str = (double)$str;                                        //除掉前面多余的零
$len = strlen($str);
if($len > 10)
        echo "長度不能大於10\n";
else
        echo n2cn($str);


function n2cn($str)
{
        global $CN,$UNIT;
        preg_match_all('/./is',$str,$m);        //取出數字
        $str = array_reverse($m[0]);                
        $str = array_chunk($str,4);                        //按位分段
        $count = count($str);
        foreach($str as $key => $num){
                        $word[] =  part($num,$key);        //分段處理
        }
        $word = array_reverse($word);
        $word = join("",$word);
        //$word = str_replace("一十","十",$word);        //一十和十的問題
        return $word;
}

function part($str,$mark)                                //分段處理算法
{
        global $CN,$UNIT;
        $str = array_reverse($str);
        $count = count($str);
        foreach($str as $key => $num){
                $data = next($str);                                //看下個數字是不是0 
                if($num!=0){
                        $word.= $CN[$num];
                        $word.= $UNIT[$count-$key-1];
                }
                elseif($data!=0){                                //如果下個數字是零那就只加一個零
                        $word.= $CN[$num];
                }
        }
        if($mark == 1 && $word!="") $word.="萬";        //萬位
        if($mark == 2 && $word!="") $word.="億";        //億位
        if($mark == 3 && $word!="") $word.="萬";        //億的萬位
        return $word;
}
?>

看到隨便寫一個玩玩..
02020202   二百零二萬零二百零二
22002020   二千二百萬二千零二十



//1. 用戶密碼六位數,不能大於六位而不能小於六數,數字值正則為[0-9],請用PHP寫出有幾種可能性,並做暴力破解;

  1. function dePassword($pwd) {  
  2. $tmp = array('000000''555555''999999');  
  3. for ($i = 0; $i < 3; $i++) {  
  4.    if ($pwd == $tmp[$i]) return $tmp[$i];  
  5. }  
  6. return $pwd < $tmp[1] ? getPwd(0, $pwd$tmp) : getPwd(1, $pwd$tmp);  
  7. }  
  8. function getPwd($i$pwd$tmp) {  
  9. $half = ceil(($tmp[$i] + $tmp[$i + 1]) / 2);  
  10. if ($half == $pwd) {  
  11.    return $half;  
  12. elseif ($half > $pwd) {  
  13.    return returnI($pwd$tmp[$i], $half);  
  14. else {  
  15.    return returnI($pwd$half$tmp[$i + 1]);  
  16. }  
  17. }  
  18. function returnI($pwd$start$end){  
  19. for ($i = $start + 1; $i < $end$i++) {  
  20.    if ($i == $pwdreturn $i;  
  21. }  
  22. }  
  23. $pwd = '000089';  
  24. printf('%06s', dePassword($pwd));  


//2.牛年求牛:有一母牛,到4歲可生育,每年一頭,所生均是一樣的母牛,到15歲絕育,不再能生,20歲死亡,問n年后有多少頭牛

  1. function niunum($n) {  
  2. static $num = 1;  
  3. for ($i = 1; $i <= $n$i++) {  
  4.    if ($i >= 4 && $i < 15) {  
  5.     $num++;  
  6.     niunum($n - $i);  
  7.    }  
  8.    if ($i == 20) $num--;  
  9. }  
  10. return $num;  
  11. }  
  12. echo niunum(10);  


//3.合並多個數組,不用array_merge(),思路:遍歷每個數組,重新組成一個新數組。

  1. function unionArray($a$b) {  
  2. $re = array();  
  3. foreach ($a as $v$re[] = $v;  
  4. foreach ($b as $v$re[] = $v;  
  5. return $re;  
  6. }  
  7. print_r(unionArray(array(1,2,4,5,'s'), array(2,5,7,'c','d')));  


/*4.二分法查找
*思路:以數組中某個值為界,再遞歸進行查找,直到結束。
*/

  1. $a = array(1,4,2,5,6,7,0,8,3);  
  2. function find($arr$start$end$key) {  
  3. sort($arr);  
  4. $mid = ceil(($start + $end) / 2);  
  5. if ($arr[$mid] == $key) {  
  6.    return $mid;  
  7. elseif ($arr[$mid] > $key) {  
  8.    return find($arr$start$mid - 1, $key);  
  9. else {  
  10.    return find($arr$mid + 1, $end$key);  
  11. }  
  12. }  
  13. echo find($a, 0, count($a), 2);  


//5.冒泡排序法

  1. function mSort($a) {  
  2. $len = count($a);  
  3. for ($i = 0; $i < $len - 1; $i++) {  
  4.    for ($j = $i$j < $len$j++) {  
  5.     if ($a[$i] > $a[$j]) {  
  6.      $tmp   = $a[$i];  
  7.      $a[$i] = $a[$j];  
  8.      $a[$j] = $tmp;  
  9.     }  
  10.    }  
  11. }  
  12. return $a;  
  13. }  
  14. print_r(mSort($a));  


//6.楊輝三角

  1. $a = array();  
  2. for ($i = 0; $i < 6; $i++) {  
  3. $a[$i][0] = 1;  
  4.     $a[$i][$i] = 1;  
  5. }  
  6. for ($i = 2; $i < 6; $i++) {  
  7. for ($j = 1; $j < $i$j++) {  
  8.    $a[$i][$j] = $a[$i-1][$j-1] + $a[$i-1][$j];  
  9. }  
  10. }  
  11. for ($i = 0; $i < 6; $i++) {  
  12. for ($j = 0; $j <= $i$j++) {  
  13.    echo $a[$i][$j].' ';  
  14.     }  
  15. echo '<br/>';  
  16. }  


/*7.給兩個字符串s1,s2,定義字符串之間的距離d(s1,s2)為通過如下操作使兩個字符串一樣的最少次數;
1.替換其中一個字符
2.刪除一個字符
3.插入一個字符
例如:kooxoo.com與kooxoo.cn的距離為2,12344與1244的距離為1,給出任意兩個字符串,求其距離,要求給出算法並分析時間復雜度

方法一:采用levenshtein($str1, $str2)內置函數
*/

  1. //1   
  2. echo levenshtein('kooxoo.com''kooxoo.cn');  
  3. echo "<br />";  
  4. //2   
  5. function levdis($s,$t){  
  6.     $n=strlen($s);  
  7.     $m=strlen($t);  
  8.     $matrix=array(range(0,$n+1),range(0,$m+1));  
  9.     $ret=0;  
  10.     if ($n==0){  
  11.         return $m;  
  12.     }  
  13.     elseif ($m==0){  
  14.         return $n;  
  15.     }  
  16.     for ($i=0;$i<=$n;$i++) {  
  17.         $matrix[$i][0]=$i;  
  18.     }  
  19.     for ($j=0;$j<=$m;$j++) {  
  20.         $matrix[0][$j]=$j;  
  21.     }  
  22.     for ($i=1;$i<=$n;$i++) {  
  23.         for ($j=1;$j<=$m;$j++) {  
  24.             if ($s[$i-1]==$t[$j-1]) {  
  25.                 $cost=0;  
  26.             }else{  
  27.                 $cost=1;  
  28.             }  
  29.            $matrix[$i][$j]=min($matrix[$i-1][$j]+1, $matrix[$i][$j-1]+1, $matrix[$i-1][$j-1]+$cost);  
  30.         }  
  31.     }  
  32.     return $matrix[$n][$m];  
  33. }  
  34. echo levdis('kooxoo.com''kooxoo.cn');  


//8.把數組array(12,34,56,32) 轉化為 array(1,2,3,4,5,6,3,2)

  1. function changeArr($arr) {  
  2. return str_split(implode(''$arr));  
  3. }  
  4. print_r(changeArr(array(12,34,56,32)));  


/*9.把數字1-1億換成漢字表述,如:123->一百二十三
*/

  1. function intToCnstr($intval) {  
  2. $cnNum = array('零','一','二','三','四','五','六','七','八','九');  
  3. $cnUnit = array('','十','百','千','萬','億');  
  4. $reCnStr = '';  
  5. $intval = intval($intval);  
  6. if ($intval < 10 && $intval >= 0) {  
  7.    $reCnStr .= $cnNum[$intval];  
  8. elseif ($intval == 1000000000) {  
  9.    $reCnStr .= $cnNum[1].$cnUnit[5];  
  10. elseif ($intval < 0 || $intval > 1000000000) {  
  11.    $reCnStr .= '';  
  12. else {  
  13.    $str = strval($intval);  
  14.    $len = strlen($str);  
  15.    for ($i = 0; $i < $len$i++) {  
  16.     if (intval($str{$i}) != 0) {  
  17.      $reCnStr .= $cnNum[intval($str{$i})];  
  18.      $j = $len - 1 - $i;  
  19.      if ($j < 5) {  
  20.       $reCnStr .= $cnUnit[$j];  
  21.      } elseif ($j >=5 && $j <= 8) {  
  22.       $reCnStr .= $cnUnit[$j - 4];  
  23.      }  
  24.     } else {  
  25.      if ($i > 0 && $str{$i} != $str{$i - 1}) $reCnStr .= $cnNum[0];  
  26.     }  
  27.    }  
  28. }  
  29. return $reCnStr;  
  30. }  
  31. echo intToCnstr(9912016);  


/*10.將一張考試卷的內容,看成一個文本文件,題目形如: 1.1.。。。。。。。(3分)(假設非空行最后字符均為空格)
*要求實現檢索出題號及其分值,並輸出類似如下的:
*1.1 3分
*1.2 3分
*1.3 5分
*/

  1. $txt = <<<EOD  
  2. 1.1請問我們(3分)  
  3. 123234324  
  4. 1.2我們收到收到(4分)  
  5. 適當方式的  
  6. 1.3test(4分)  
  7. EOD;  
  8. $match_1 = $match_2 = $match = array();  
  9. preg_match_all("//d+/./d/S+/"$txt$strArr);  
  10. foreach ($strArr[0] as $k => $v) {  
  11. preg_match('/^/d+/./d+/'$v$match_1[$k]);  
  12. preg_match('//d+分/'$v$match_2[$k]);  
  13. }  
  14. for ($i = 0; $i < count($match_1); $i++) {  
  15. $match[$i] = $match_1[$i][0].' '.$match_2[$i][0];  
  16. }  
  17. print_r($match);  


/*11.在一組數中,要求插入一個數,按其原來順序插入,維護原來排序方式。
*思路:找到比要插入數大的那個位置,替換然后把后面的數后移一位。
*/

  1. function insertNum($num$arr) {  
  2. $len = count($arr);  
  3. if ($arr[$len - 1] <= $num) {  
  4.    $arr[$len] = $num;  
  5.    return $arr;  
  6. }  
  7. for ($i = 0; $i < $len - 1; $i++) {  
  8.    if ($arr[$i] > $num) {  
  9.     $t1 = $arr[$i];  
  10.     $arr[$i] = $num;  
  11.     for ($j = $i + 1; $j <= $len$j++) {  
  12.      $t2 = $arr[$j];  
  13.      $arr[$j] = $t1;  
  14.      $t1 = $t2;  
  15.     }  
  16.     break;  
  17.    }  
  18. }  
  19. return $arr;  
  20. }  
  21. print_r(insertNum(3, array(1,2,3,4,5)));  


/*12.對一組數進行排序(快速排序算法)。
*思路:通過一趟排序分成兩部分,然后遞歸對這兩部分排序,最后合並。
*/

  1. function quickSort($arr) {  
  2. if (count($arr) <= 1) return $arr;  
  3. $key = $arr[0];  
  4. $left = $right = array();  
  5. $len = count($arr);  
  6. for ($i = 1; $i < $len$i++) {  
  7.    if ($arr[$i] <= $key$left[] = $arr[$i];  
  8.    else $right[] = $arr[$i];  
  9. }  
  10. $left = quickSort($left);  
  11. $right = quickSort($right);  
  12. return array_merge($leftarray($key), $right);  
  13. }  
  14. print_r(quickSort(array(1,3,23,5,234,65,6)));  


/*字符:0-9 或 a-z
*長度:1
*那就生成0,1,2,3,4,5,6,7,8,9
*長度:2,就會生成00-99
*/

  1. //1   
  2. function echoStr($len = 1, $type='num') {  
  3. $str = '';  
  4. if ($len < 1) return ;  
  5. if ($type == 'num') {  
  6.    $ascStart = 48;  
  7.    $ascEnd   = 57;  
  8. elseif ($type == 'char') {  
  9.    $ascStart = 97;  
  10.    $ascEnd   = 122;  
  11. else {  
  12.    return ;  
  13. }  
  14. for ($i = $ascStart$i <= $ascEnd$i++) {  
  15.    for ($j = 1; $j <= $len$j++) $str .= chr($i);  
  16.    $str .= ',';  
  17. }  
  18. return substr($str, 0, -1);  
  19. }  
  20. //2   
  21. function echoStr2($len) {  
  22. $str = '';  
  23. $char = '1234567890qwert!@#$';  
  24. $cLen = strlen($char);  
  25. for ($i = 0; $i < $cLen$i++) {  
  26.    for ($j = 1; $j <= $len$j++) {  
  27.     $str .= $char[$i];  
  28.    }  
  29.    $str .= ',';  
  30. }  
  31. return substr($str, 0, -1);  
  32. }  
  33. echo echoStr(3, 'num')."<br />";  
  34. echo echoStr(2, 'char')."<br />";  
  35. echo echoStr2(2);  

 


/*已知字符串 $string = "2dsjfh87HHfytasjdfldiuuidhfcjh";
*找出 $string 中出現次數最多的所有字符。
*/

  1. //1   
  2. $string = "2dsjfh87HHfytasjdfldiuuidhfcjh";  
  3. $re = count_chars($string, 1);  
  4. print_r(array_map("chr"array_keys($re, max($re))));  
  5. echo "<br />";  
  6. //2   
  7. $b = array_count_values(str_split($string));  
  8. print_r(array_keys($b, max($b)));  
  9. //線性表的刪除(數組中實現)   
  10. function delete_array_element($array$i) {  
  11. $len = count($array);  
  12.     for ($j=$i$j<$len$j++){  
  13.    $array[$j] = $array[$j+1];  
  14. }  
  15.     array_pop($array); //刪除最后空元素   
  16.     return $array;  
  17. }  
  18. print_r(delete_array_element(array(1,2,3,4,5), 2)); 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com