二分搜索
基本思想:
假设数据按升序排列,对于给定值 x,从序列中间开始比较。如果当前位置值等于 x,则查找成功;如果 x 小于当前位置值,则在序列的前半部分查找;如果 x 大于当前位置值,则继续在序列的后半部分查找,直至找到为止。(数据量较大时使用)
顺序搜索
基本思想:
从数组第一个元素开始,逐个向下查找,如果有与目标匹配的元素,则查找成功;如果最后一个元素处仍然没有目标元素,则查找失败。
简化增强版
function seq_sch($array, $k){
$y = $m = 'no';
foreach($array as $i => $v){
if($v == $k){
if($i == 'no'){$m = 'yes'}//防止key = no
$y = $i;
break;
}
}
if ($y != 'no' || $m == 'yes'){
return $y;
}else{
return -1;
}
}
此方法适用于所有一维数组
PHP 奇怪的算法
PHP 7 以下版本返回 6,而 PHP 7 返回 5,这确实很奇怪。我的底层算法很差,所以我认为是 PHP 7 以下版本的 BUG。
线性表的删除(数组实现)
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 ;
}
字符串长度
function strlen ($str){
if ($str == '' ) return 0;
$count = 0;
while (1){
if ($str[$count] != NULL){
$count++;
continue;
}else{
break;
}
}
return $count;
}
function substr($str, $start, $length=NULL){
if ($str== '' || $start>strlen($str)) return;
if (($length!=NULL) && ($start>0) && ($length>strlen($str)-$start)) return;
if (($length!=NULL) && ($start<0) && ($length>strlen($str )+$start)) return;
if ($length == NULL) $length = (strlen($str) - $start);
if ($start < 0){
for ($i=(strlen($str)+$start); $i<(strlen ($str)+$start+$length ); $i++) {
$substr .= $str[$i];
}
}
if ($length > 0){
for ($i= $start; $i<($start+$length); $i++) {
$substr .= $str[$i];
}
}
if ($length < 0){
for ($i =$start; $i<(strlen($str)+$length); $i++) {
$substr .= $str[$i ];
}
}
return $substr;
字符串反转
function strrev($str){
if ($str == '') return 0 ;
for ($i=(strlen($str)- 1); $i>=0; $i --){
$rev_str .= $str[$i ];
}
return $rev_str;
}
字符串比较
function strcmp($s1, $s2){
if (strlen($s1) < strlen($s2)) return -1 ;
if (strlen($s1) > strlen( $s2)) return 1;
for ($i=0; $i
查找字符串
function strstr($str, $substr){
$m = strlen($str);
$n = strlen($substr);
if ($m < $n) return false ;
for($i=0; $i<=($m-$n+1); $i++){
$sub = substr($str, $i, $n);
if (strcmp($sub, $substr) == 0) return $i;
}
return false ;
}
(sub,sub,)字符串比较方法如果不想使用比较方法请添加for循环字符串替换
function str_replace($substr, $newsubstr, $str){
$m = strlen($str);
$n = strlen($substr);
$x = strlen($newsubstr);
if (strchr($str, $substr) == false) return false;
$str_new = $str
for ($i=0; $i<=($m-$n+1); $i++){
$i = strchr($str, $substr);
$str = str_delete($str_new, $i, $n);
$str = str_insert($str_new, $i, $newstr);
}
return $str_new;
}
插入字符串
function str_insert($str, $i , $substr) {
for($j=0 ; $j<$i; $j++){
$startstr .= $str[$j];
}
for ($j=$i; $j
删除字符串
function str_delete($str, $i, $j){
for ( $c=0; $c<$i; $c++){
$startstr .= $str [$c];
}
for ($c=( $i+$j); $c
复制字符串
function strcpy($s1, $s2){
if (strlen($s1)==NULL || !isset($s2)) return;
for ($i=0; $i
连接字符串
function strcat($s1 ,$s2){
if (!isset($s1) || !isset( $s2)) return;
$newstr = $s1 ;
for($i=0; $i
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
字符集:输入一个字符串,找出该字符串所包含的字符集,并按顺序排序(英文)
function set($str){
//转化为数组
$arr = str_split($str);
//去除重复
$arr = array_flip(array_flip($arr));
//排序
sort($arr);
//返回字符串
return implode('', $arr);
}
遍历文件夹
编写一个函数,尽可能高效地从标准 URL 中提取文件扩展名。
string 'http' (length=4)
//'host' => string 'www.sina.com.cn' (length=15)
//'path' => string '/abc/de/fg.php' (length=14)
//'query' => string 'id=1' (length=4)
$file = basename($arr['path']);// basename函数返回路径中的文件名部分
$ext = explode('.', $file);
return $ext[count($ext)-1];
}
print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));
?>
一种实现中文字符串截取不乱码的方法
可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。
数据结构和算法
让对象像数组一样可循环,要求属性为私有。(PHP5实现该模式,写一个类来实现接口)(腾讯)
1,'name'=>'php');
public function rewind(){
reset($this->item);
}
public function current(){
return current($this->item);
}
public function key(){
return key($this->item);
}
public function next(){
return next($this->item);
}
public function valid(){
return($this->current()!==false);
}
}
//测试
$t=new Test;
foreach($t as $k=>$v){
echo$k,'--->',$v,'
';
}
?>
使用PHP实现双向队列(腾讯)
queue,$item);
}
public function addLast($item){
return array_push($this->queue,$item);
}
public function removeFirst(){
return array_shift($this->queue);
}
public function removeLast(){
return array_pop($this->queue);
}
}
?>
请使用冒泡排序对以下数据进行排序:10 2 36 14 10 25 23 85 99 45。
$arr[$j]) {
$temp = $arr[$j-1];
$arr[$j-1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
}
// 测试
$arr = array(10,2,36,14,10,25,23,85,99,45);
bubble_sort($arr);
print_r($arr);
?>
写一个排序算法(写出代码)并解释如何优化它。(新浪)
= $pivotkey){
$high--;
}
$temp = $arr[$low];
$arr[$low] = $arr[$high];
$arr[$high] = $temp;
while($low < $high && $arr[$low] <= $pivotkey){
$low++;
}
$temp=$arr[$low];
$arr[$low]=$arr[$high];
$arr[$high]=$temp;
}
return$low;
}
function quick_sort(&$arr,$low,$high){
if($low < $high){
$pivot = partition($arr,$low,$high);
quick_sort($arr,$low,$pivot-1);
quick_sort($arr,$pivot+1,$high);
}
}
?>
关于猴子的面试问题
一群猴子排成一个圆圈,并标上 1,2,……,n 的编号。然后从第一只猴子开始数,数到第 m 只猴子,把它踢出圆圈,再从它的后面数,数到第 m 只猴子,再把它踢出圆圈……,如此反复,直到只剩下一只猴子。那只猴子被称为国王。你需要编程模拟这个过程,输入 m 和 n,输出最后一只国王的编号。(新浪)(小米)
1) {
$i += 1;
$head = array_shift($mokey);//一个个出列最前面的猴子
if ($i % $m !=0) {
#如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
array_push($mokey,$head);
}
// 剩下的最后一个就是大王了
return $mokey[0];
}
}
// 测试
echo king(10,7);
// 方案二,使用数学方法解决
function josephus($n,$m){
$r = 0;
for ($i=2; $i <= $m ; $i++) {
$r = ($r + $m) % $i;
}
return $r+1;
}
// 测试
print_r(josephus(10,7));
// 方案三
function king($n, $m){
$monkeys = range(1, $n); //创建1到n数组
$i=0;
while (count($monkeys)>1) { //循环条件为猴子数量大于1
if(($i+1)%$m==0) { //$i为数组下标;$i+1为猴子标号
unset($monkeys[$i]); //余数等于0表示正好第m个,删除,用unset删除保持下标关系
} else {
//如果余数不等于0,则把数组下标为$i的放最后,形成一个圆形结构
array_push($monkeys,$monkeys[$i]);
unset($monkeys[$i]);
}
$i++;//$i 循环+1,不断把猴子删除,或 push到数组
}
return current($monkeys); //猴子数量等于1时输出猴子标号,得出猴王
}
echo king(6,3);
?>
二维数组排序算法函数可通用,可调用PHP内置函数。
$val){
$keysvalue[$key] = $val[$keys];
}
print_r($keysvalue);
//对数组按照指定字段排序并保持索引关系
if($order == 0){
asort($keysvalue);
}else{
arsort($keysvalue);
}
print_r($keysvalue);
$new_array=array();
//按照排好序的下标,重新组合原二维数组
foreach($keysvalue as $key => $val){
$new_array[$key] = $arr[$key];
}
return $new_array;
}
//测试
$person=array(
array('id'=>2,'name'=>'lhangsan','age'=>23),
array('id'=>5,'name'=>'zisi','age'=>28),
array('id'=>3,'name'=>'apple','age'=>17)
);
$result = array_sort($person,'name',0);
print_r($result);
?>
顺序查找和二分查找(也叫二分搜索)算法。顺序查找必须考虑效率。对象可以是有序数组(小米)
";
// 测试:二分查找
$arr2 = array(5,9,15,25,34,47,55,76);
echo bin_sch($arr2,0,7,47);//结果为5
?>
改组算法
有一头母牛,4岁起每年产一头母牛,母牛都一样,15岁绝育,不能再生育,20岁死亡,请问n年后母牛有多少头?
function niu($y){
static $num= 1; //定义静态变量;初始化牛的数量为1
for ($i=1; $i <=$y ; $i++) {
if($i>=4 && $i<15){ //每年递增来算,4岁开始+1,15岁不能生育
$num++;
niu($y-$i); //递归方法计算小牛$num,小牛生长年数为$y-$i
}else if($i==20){
$num--; //20岁死亡减一
}
return $num;
}
在 PHP 中实现斐波那契数列
/**
* 斐波那契数列
* @param $n
* @return mixed
*/
function fbnq($n){
$arr[1] = 1;
$arr[2] = 1;
for($i=3; $i<=$n; $i++){
$arr[$i] = $arr[$i-1] + $arr[$i-2];
}
return $arr;
}
var_dump(array_values(fbnq(10)));die;
比较两个文件路径的相对位置
$b = '/a/b/c/d/e.php';
$a = '/a/b/f/g/j/h.php';
function diff($a, $b){
$aArr = explode('/',$a);
$bArr = explode('/',$b);
$bCount = count($bArr);
$k = 0;
for($i=0;$i<$bCount;$i++){
if($aArr[$i] != $bArr[$i]){
$k = $i;
break;
}
}
//echo $k;die;
//var_dump(array_fill(0, $bCount-$k, '..'));die;
$result = array_merge(array_fill(1, $bCount-$k-1, '..'), array_slice($aArr,$k));
return implode('/', $result);
}
var_dump(diff($a, $b));die;
帕斯卡三角形
num=$var;
}
public function display(){
$n=$this->num;
$arr=array();
//$arr=array_fill(0,$n+1,array_fill(0,$n+1,0));
$arr[1]=array_fill(0,3,0);
$arr[1][1]=1;
echo str_pad(" ",$n*12," ");
printf("%3d",$arr[1][1]);
echo "
";
for($i=2;$i<=$n;$i++){
$arr[$i]=array_fill(0,($i+2),0);
for($j=1;$j<=$i;$j++){
if($j==1)
echo str_pad(" ",($n+1-$i)*12," ");
printf("%3d",$arr[$i][$j]=$arr[$i-1][$j-1]+$arr[$i-1][$j]);
echo " ";
}
echo"
";
}
}
}
$yh=new T('3'); //$yh=new T(数量);
$yh->display();
?>
一个人想爬一段有 n 级台阶的楼梯,每次他只能走 1 级或 2 级台阶,请问他有多少种爬上所有台阶的方法?比如总共有 3 级台阶,他可以先走 1 级台阶再走 2 级台阶,或者先走 2 级台阶再走 1 级台阶,或者走 1 级台阶 3 次,一共有 3 种方法。
function jieti($num){ //实际上是斐波那契数列
return $num<2?1:jieti($num-1)+jieti($num-2);
}
请写一段PHP代码,保证多个进程可以同时成功写入同一个文件
无限分类
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
if ($v['pid'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['id'],$level+1);
}
}
return $list;
}
获取上个月的第一天和最后一天
//获取上个月第一天
date('Y-m-01',strtotime('-1 month'));
//获取上个月最后一天
date('Y-m-t',strtotime('-1 month'));
输入随机数查询对应数据区间
//把区间换成数组写法,用二分法查找区间
function binsearch($x,$a){
$c=count($a);
$lower=0;
$high=$c-1;
while($lower<=$high){
$middle=intval(($lower+$high)/2);
if($a[$middle]>=$x){
$high=$middle-1;
}elseif($a[$middle]<=$x ){
$lower=$middle+1;
}
}
return '在区间'.$a[$high].'到'.$a[$lower];
}
$array = ['1','50','100','150','200','250','300'];
$a = '120';
echo binsearch($a,$array);
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。