//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