关于php常见代码题,算法题


在php的面试中,算法题其实常见的就是三种,快速排序,冒泡,二分,基本上这三种可以熟练的掌握可以应付大部分的小公司面试,当然在这篇文章中我试图收集更多的题目,以便大家进行复习

1.冒泡排序

冒泡排序即循环要从第一个值开始循环数组中的每一个值与下一个值进行比较,按照需求把大的或者小的值进行交换位置,这样每完成一次大循环就可以把一个最大或者最小值放到数组的最后,当把所有的值循环完成后即得到一个有顺序的数组

下面我们写一个从小到大的冒泡排序

	function bubble_sort($array)
	{
    
    
		//首先计算数组的长度
		$count = count($array);
		//空数组或一个值的数组无需排序直接返回即可
		if ($count <= 1)	{
    
    
			return $array;
		}
		//首先通过循环拿到数组的第一个值
		for ($i = 0; $i < $count; $i++) {
    
    
			//用拿到的值与下一位进行比较,交换位置,直到与最后一位完成比较
			for ($k = $i + 1; $k < $count; $k++) {
    
    
				if ( $array[$i] > $array[$k]) {
    
    
					$temp = $array[$i];
					$array[$i] = $array[$k];
					$array[$k] = $temp;
				}
				//如果是小于或者等于的情况,不需要交换位置所以不需要处理
			}
		}
		return $array;
	}

2.快速排序

从数组中选择一个值作为标尺, 大于这个值的放在右边,小于这个值的放在左边,然后左右两个数组再递归调用这个方法,最后将返回的方法合并,即可得到一个有顺序的数组

	function quickSort($array) {
    
    
		$count = count($array);
		if ($count <= 1) {
    
    
			return $array;
		}
		$left = [];
		$right = [];
		$compare = $array[0];//虽然取哪个值都无所谓但是为了防止自己取不到值,所以选择第一个;
		for ($i = 1; $i < $count; $i++) {
    
    
			if ($array[$i] >= $compare) {
    
    
				$right[] = $array[$i];
			} else {
    
    
				$left[] = $array[$i];
			}
		}
		//此时得到两个数组,左边都是小于标尺的,右边都是大于标尺的,我们再次递归调用函数
		$left = quickSort($left);
		$right= quickSort($right);
		//最后将左边,标尺,右边进行合并,即可
		return array_merge($left,array($compare),$right);
	}

3.二分查找

二分查找只能对已经排序完成的数组进行查找,
以一个从大到小排列的数组为例,每次从数组的中间位置取值与要比较的数组进行比较,如果大于该值,说明要找的值在左边,相反则在右边,如果相等则返回该值的key

	function searchKey($array, $search) {
    
    
		$count = count($array);
		$start = 0;
		$end = count($array) - 1;
		while($start <= $end) {
    
    
			//取中间值
			$mid = floor(($end + $start)/2);
			if ($saerch == $array[$mid]){
    
    
				return $mid;
			} elseif ($search > $array[$mid]) {
    
    
				$end = $mid - 1;
			} else {
    
    
				$start = $mid + 1;
			}
		}
		return '查找的值不在数组中';
	}

4.猴子选大王

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

	function chooseKing($m, $n){
    
    
		//生成一个数组   array('1','2','3','4',.....'n');
		$mokeys = range(1,$n);
		//设置标尺
		$i = 0;
		while (count($mokeys)>1) {
    
    
			/*
				//对m进行取余  如果值为0则说明可以正好数到m,则从数组中剔出
				if ($i%$m = 0) {
					unset($mokeys[$i]);
				} else {
					//如果不是这只猴子,把他的编号塞进数组的末尾,并把当前位置舍去,继续参与接下来的计算
					array_push($mokeys,$mokeys[$i]);
					unset($mokeys[$i]);
				}
				//由上代码我们可以知道不管是否是这只猴子都会有一个unset的操作,我们可以将代码化简入戏
			*/
			if (($i + 1)%$m != 0) {
    
    
				array_push($mokeys,$mokeys[$i]);
			}
			unset($mokeys[$i]);
			$i ++;
		}
		return current($mokeys);
	}

5.母牛生小牛

有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。

	function niu($y){
    
    
		$num = 1;
		for ($i = 0; $i < $y; $i++) {
    
    
			if ($i > 4 && $i < 15) {
    
    
				$num ++ ;
				niu($y - $i);
			} elseif ($i == 20) {
    
    
				$num --;
			}
		}
		return $num;
	}

6.遍历一个文件下的所有文件和子文件夹下的文件

function readFiles($dir) {
    
    
	$files = [];
	//拿到句柄
	if(@$handle = opendir($dir)) {
    
    
		//打开文件夹
		while(($file = readdir($handle)) !== false) {
    
    
			//排除上级及当前目录
			if($file != ".." && $file != ".") {
    
    
				//如果是子文件夹,进行递归
				if(is_dir($dir . "/" . $file)) {
    
     
					$files[$file] = readFiles($dir . "/" . $file);
				} else {
    
    
				//如果是文件放到数组中
					$files[] = $file;
				}
			}
		}
        closedir($handle);
    }
	return $files;
}

猜你喜欢

转载自blog.csdn.net/wolegequ1993/article/details/105256280
今日推荐