PHP部分常见算法

//1. 用户密码六位数,不能大于六位而不能小于六数,数字值正则为[0-9],请用PHP写出有几种可能性,并做暴力破解;
function dePassword($pwd) { $tmp = array('000000', '555555', '999999'); for ($i = 0; $i < 3; $i++) { if ($pwd == $tmp[$i]) return $tmp[$i]; } return $pwd < $tmp[1] ? getPwd(0, $pwd, $tmp) : getPwd(1, $pwd, $tmp); } function getPwd($i, $pwd, $tmp) { $half = ceil(($tmp[$i] + $tmp[$i + 1]) / 2); if ($half == $pwd) { return $half; } elseif ($half > $pwd) { return returnI($pwd, $tmp[$i], $half); } else { return returnI($pwd, $half, $tmp[$i + 1]); } } function returnI($pwd, $start, $end){ for ($i = $start + 1; $i < $end; $i++) { if ($i == $pwd) return $i; } } $pwd = '000089'; printf('%06s', dePassword($pwd));


//2.牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛
function niunum($n) { static $num = 1; for ($i = 1; $i <= $n; $i++) { if ($i >= 4 && $i < 15) { $num++; niunum($n - $i); } if ($i == 20) $num--; } return $num; } echo niunum(10);


//3.合并多个数组,不用array_merge(),思路:遍历每个数组,重新组成一个新数组。
function unionArray($a, $b) { $re = array(); foreach ($a as $v) $re[] = $v; foreach ($b as $v) $re[] = $v; return $re; } print_r(unionArray(array(1,2,4,5,'s'), array(2,5,7,'c','d')));


/*4.二分法查找
*思路:以数组中某个值为界,再递归进行查找,直到结束。
*/
$a = array(1,4,2,5,6,7,0,8,3); function find($arr, $start, $end, $key) { sort($arr); $mid = ceil(($start + $end) / 2); if ($arr[$mid] == $key) { return $mid; } elseif ($arr[$mid] > $key) { return find($arr, $start, $mid - 1, $key); } else { return find($arr, $mid + 1, $end, $key); } } echo find($a, 0, count($a), 2);


//5.冒泡排序法
function mSort($a) { $len = count($a); for ($i = 0; $i < $len - 1; $i++) { for ($j = $i; $j < $len; $j++) { if ($a[$i] > $a[$j]) { $tmp = $a[$i]; $a[$i] = $a[$j]; $a[$j] = $tmp; } } } return $a; } print_r(mSort($a));


//6.杨辉三角
$a = array(); for ($i = 0; $i < 6; $i++) { $a[$i][0] = 1; $a[$i][$i] = 1; } for ($i = 2; $i < 6; $i++) { for ($j = 1; $j < $i; $j++) { $a[$i][$j] = $a[$i-1][$j-1] + $a[$i-1][$j]; } } for ($i = 0; $i < 6; $i++) { for ($j = 0; $j <= $i; $j++) { echo $a[$i][$j].' '; } echo '
'; }


/*7.给两个字符串s1,s2,定义字符串之间的距离d(s1,s2)为通过如下操作使两个字符串一样的最少次数;
1.替换其中一个字符
2.删除一个字符
3.插入一个字符
例如:kooxoo.com与kooxoo.cn的距离为2,12344与1244的距离为1,给出任意两个字符串,求其距离,要求给出算法并分析时间复杂度

方法一:采用levenshtein($str1, $str2)内置函数
*/
//1 echo levenshtein('kooxoo.com', 'kooxoo.cn'); echo "
"; //2 function levdis($s,$t){ $n=strlen($s); $m=strlen($t); $matrix=array(range(0,$n+1),range(0,$m+1)); $ret=0; if ($n==0){ return $m; } elseif ($m==0){ return $n; } for ($i=0;$i<=$n;$i++) { $matrix[$i][0]=$i; } for ($j=0;$j<=$m;$j++) { $matrix[0][$j]=$j; } for ($i=1;$i<=$n;$i++) { for ($j=1;$j<=$m;$j++) { if ($s[$i-1]==$t[$j-1]) { $cost=0; }else{ $cost=1; } $matrix[$i][$j]=min($matrix[$i-1][$j]+1, $matrix[$i][$j-1]+1, $matrix[$i-1][$j-1]+$cost); } } return $matrix[$n][$m]; } echo levdis('kooxoo.com', 'kooxoo.cn');


//8.把数组array(12,34,56,32) 转化为 array(1,2,3,4,5,6,3,2)
function changeArr($arr) { return str_split(implode('', $arr)); } print_r(changeArr(array(12,34,56,32)));


/*9.把数字1-1亿换成汉字表述,如:123->一百二十三
*/
function intToCnstr($intval) { $cnNum = array('零','一','二','三','四','五','六','七','八','九'); $cnUnit = array('','十','百','千','万','亿'); $reCnStr = ''; $intval = intval($intval); if ($intval < 10 && $intval >= 0) { $reCnStr .= $cnNum[$intval]; } elseif ($intval == 1000000000) { $reCnStr .= $cnNum[1].$cnUnit[5]; } elseif ($intval < 0 || $intval > 1000000000) { $reCnStr .= ''; } else { $str = strval($intval); $len = strlen($str); for ($i = 0; $i < $len; $i++) { if (intval($str{$i}) != 0) { $reCnStr .= $cnNum[intval($str{$i})]; $j = $len - 1 - $i; if ($j < 5) { $reCnStr .= $cnUnit[$j]; } elseif ($j >=5 && $j <= 8) { $reCnStr .= $cnUnit[$j - 4]; } } else { if ($i > 0 && $str{$i} != $str{$i - 1}) $reCnStr .= $cnNum[0]; } } } return $reCnStr; } echo intToCnstr(9912016);


/*10.将一张考试卷的内容,看成一个文本文件,题目形如: 1.1.。。。。。。。(3分)(假设非空行最后字符均为空格)
*要求实现检索出题号及其分值,并输出类似如下的:
*1.1 3分
*1.2 3分
*1.3 5分
*/

$txt = << $v) { preg_match('/^/d+/./d+/', $v, $match_1[$k]); preg_match('//d+分/', $v, $match_2[$k]); } for ($i = 0; $i < count($match_1); $i++) { $match[$i] = $match_1[$i][0].' '.$match_2[$i][0]; } print_r($match);


/*11.在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。
*思路:找到比要插入数大的那个位置,替换然后把后面的数后移一位。
*/

function insertNum($num, $arr) { $len = count($arr); if ($arr[$len - 1] <= $num) { $arr[$len] = $num; return $arr; } for ($i = 0; $i < $len - 1; $i++) { if ($arr[$i] > $num) { $t1 = $arr[$i]; $arr[$i] = $num; for ($j = $i + 1; $j <= $len; $j++) { $t2 = $arr[$j]; $arr[$j] = $t1; $t1 = $t2; } break; } } return $arr; } print_r(insertNum(3, array(1,2,3,4,5)));


/*12.对一组数进行排序(快速排序算法)。
*思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。
*/

function quickSort($arr) { if (count($arr) <= 1) return $arr; $key = $arr[0]; $left = $right = array(); $len = count($arr); for ($i = 1; $i < $len; $i++) { if ($arr[$i] <= $key) $left[] = $arr[$i]; else $right[] = $arr[$i]; } $left = quickSort($left); $right = quickSort($right); return array_merge($left, array($key), $right); } 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 function echoStr($len = 1, $type='num') { $str = ''; if ($len < 1) return ; if ($type == 'num') { $ascStart = 48; $ascEnd = 57; } elseif ($type == 'char') { $ascStart = 97; $ascEnd = 122; } else { return ; } for ($i = $ascStart; $i <= $ascEnd; $i++) { for ($j = 1; $j <= $len; $j++) $str .= chr($i); $str .= ','; } return substr($str, 0, -1); } //2 function echoStr2($len) { $str = ''; $char = '1234567890qwert!@#$'; $cLen = strlen($char); for ($i = 0; $i < $cLen; $i++) { for ($j = 1; $j <= $len; $j++) { $str .= $char[$i]; } $str .= ','; } return substr($str, 0, -1); } echo echoStr(3, 'num')."
"; echo echoStr(2, 'char')."
"; echo echoStr2(2);

 


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

//1 $string = "2dsjfh87HHfytasjdfldiuuidhfcjh"; $re = count_chars($string, 1); print_r(array_map("chr", array_keys($re, max($re)))); echo "
"; //2 $b = array_count_values(str_split($string)); print_r(array_keys($b, max($b))); //线性表的删除(数组中实现) function delete_array_element($array, $i) { $len = count($array); for ($j=$i; $j<$len; $j++){ $array[$j] = $array[$j+1]; } array_pop($array); //删除最后空元素 return $array; } print_r(delete_array_element(array(1,2,3,4,5), 2));

你可能感兴趣的:(PHP)