[转]PHP部分常见算法

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 == $pwd) return $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($left, array($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 = ‘[email protected]#$‘;
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)); 


转载自:http://blog.csdn.net/caleng/article/details/5276403

时间: 2024-09-17 13:33:19

[转]PHP部分常见算法的相关文章

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

机器学习常见算法分类汇总

机器学习常见算法分类汇总 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里 IT 经理网为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的.这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的类似性. 学习方式 根据数据类型的不同,对一个问题的建模有不同的方式.在机器学习或者人工智能领域,人们首先会考虑算法的学习

前端常见算法JS实现

算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的. 排序算法 1. 冒泡排序 //冒泡排序 function bubbleSort(arr){ var i = j = 0; for(i=1;i<arr.length;i++){ for(j=0;j<=arr.length-i;j++){ var temp = 0; if(arr[j]>arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } 2.

机器学习14种常见算法

最近收到一封公司内部邮件,说,有个机器人程序--**小助手,上线(不知道哪个部门写的),让大家没事的时候,测试,顺便让程序学习一下,超过 50 条聊天,有抽奖机会~我大概试了一下,有点无语,这写得是个神马玩意啊,这么烂,基本聊不上 3 句,最多也就是,"你是谁","多大了",即便我顺着程序说,也是驴唇不对马嘴~你要是让程序学习,互联网这么大,还用得着让人来吗,即便让人来,自己也得差不多才行啊,连个雏形都没有,还好意思让大家测试,美其名曰:让程序学习~ 机器学习无疑是

[Machine Learning] 机器学习常见算法分类汇总

声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.本文为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的.这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的分类. 博主根据原创基础上加入了遗

面试常见算法-排序查找算法

算法是程序员必被的一个技能,在面试中常常出现,下面总结了面试中出现的常见算法,这些算法程序员应该牢记在心中,要非常熟练. 插入排序算法 原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序. 要点:设立哨兵,作为临时存储和判断数组边界之用. public class InsertSort { private static void insertSort(int[] a) { int j; int tmp; for

五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)

近日复习了一些算法知识,小记于此 递归与分治法 直接或间接地调用自身的算法称为递归算法. 递归是算法设计与分析中常用的一种技术,描述简单且易于理解. 分治法的设计思想是将一个规模为n难以解决的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同. 递归地解这些子问题,然后将各子问题的解合并得到原问题的解. 典型例子:Fibonacci数列,阶乘,Hanoi塔:二分法搜索.快速排序.合并排序. 动态规划法 动态规划过程是:根据当前(阶段)状态,采取相应的决策,引起状态的转移.如下图,一

C#常见算法题目

    //冒泡排序    public class bubblesorter    {        public void sort(int[] list)        {            int i, j, temp;            bool done = false;            j = 1;            while ((j < list.Length) && (!done))            {                don

机器学习常见算法优缺点总结

机器学习常见算法优缺点总结 K近邻:算法采用测量不同特征值之间的距离的方法进行分类. 优点: 1.简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归: 2.可用于数值型数据和离散型数据: 3.训练时间复杂度为O(n):无数据输入假定: 4.对异常值不敏感 缺点: 1.计算复杂性高:空间复杂性高: 2.样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少): 3.一般数值很大的时候不用这个,计算量太大.但是单个样本又不能太少 否则容易发生误分. 4.最大的缺点是无法给

[转] js_常见算法

js模拟螺旋矩形算法 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-e