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 '<br/>';
}

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 "<br />";
//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 = <<<EOD
1.1请问我们(3分)
123234324
1.2我们收到收到(4分)
适当方式的
1.3test(4分)
EOD;
$match_1 = $match_2 = $match = array();
preg_match_all("//d+/./d/S+/", $txt, $strArr);
foreach ($strArr[0] as $k => $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')."<br />";
echo echoStr(2, 'char')."<br />";
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 "<br />";
//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));

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

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

  1. Hadoop学习笔记—12.MapReduce中的常见算法

    一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...

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

    声明:本篇博文根据http://www.ctocio.com/hotnews/15919.html整理,原作者张萌,尊重原创. 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多 ...

  3. acm常见算法及例题

    转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题  初期:一.基本算法:     (1)枚举. (poj17 ...

  4. 常见算法是js实现汇总(转载)

    常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...

  5. paper 12:机器学习常见算法分类汇总

    机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里南君先生为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困 ...

  6. AI - 机器学习常见算法简介(Common Algorithms)

    机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...

  7. 前端常见算法的JS实现

    1.冒泡排序 function bubbleSort(arr){ var i = 0, j = 0; for(i=1; i<arr.length; i++){ for(j=0; j<=ar ...

  8. 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

    今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...

  9. 常见算法(logistic回归,随机森林,GBDT和xgboost)

    常见算法(logistic回归,随机森林,GBDT和xgboost) 9.25r早上面网易数据挖掘工程师岗位,第一次面数据挖掘的岗位,只想着能够去多准备一些,体验面这个岗位的感觉,虽然最好心有不甘告终 ...

  10. JS中常见算法问题

    JS中常见算法问题 1. 阐述JS中的变量提升(声明提前) 答:将所有的变量提升当当前作用域的顶部,赋值留在原地.意味着我们可以在某个变量声明前就使用该变量. 虽然JS会进行变量提升,但并不会执行真正 ...

随机推荐

  1. 【Oracle】实现Oracle数据库对象的一键升级

    引言     公司内部的项目比较倾向于将业务逻辑放在oracle存储过程中实现,所以每次项目升级都涉及到很多的oracle表,存储过程等数据库对象的升级.然而采取的升级方式是比较"原始&qu ...

  2. 关于js冒泡、捕获、以及阻止冒泡

    有如下html <ul> <li> <p> <a href="javascript:;">click me</a> &l ...

  3. JavaScript如何处理解析JSON数据详解

    JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...

  4. 让您的Chrome浏览器允许本地环境支持Ajax

    对于网站前端人员来说,我们在本地开发程序的时候如果用到Ajax的话,通常会使用Firefox来测试,因为Firefox的安全策略支持本地Ajax,IE系列和Chrome都不支持. 不过,经过笔者亲身体 ...

  5. 二叉排序树的应用(java)

    package com.tree.find; public class TestSearchBST { private static class BiNode{ int data; BiNode lc ...

  6. PHP学习之数组Array操作和键值对操作函数(一)

    PHP 中的数组实际上是一个有序映射.映射是一种把 values关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合, ...

  7. [独孤九剑]Oracle知识点梳理(八)常见Exception

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  8. jacksi(比较实用的工具批处理)

    批处理类别: 国产软件 批处理语言: 简体中文 授权方式: 免费软件 运行环境: Windows平台 警告:运行BAT源码是一种危险的动作,如果你不熟悉,请不要尝试! 这里分享的是用bat写的比较实用 ...

  9. 蓝桥杯 算法训练 ALGO-119 寂寞的数

    算法训练 寂寞的数 时间限制:1.0s   内存限制:256.0MB 问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和.例如,d(2 ...

  10. boost的asio接收单路大数据量udp包的方法

    开发windows客户端接收RTP视频流,当h264视频达到1080P 60fps的时候,按包来调用recvfrom的函数压力比较大,存在丢包的问题,windows的完成端口的性能效果当然可以解决这个 ...