记录一下:
1,冒泡排序
百科原理:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
个人理解的原理:将其转为数组后,依次循环数组中的元素,分别与数组后面的元素进行比较,小数左移,大数右移到原小数的位置。
public function maopao(){
$arr = [4,30,5,3,99,78,100,12,78,3];
$len = count($arr);
//原理:依次循环数组中的元素,分别与数组后面的元素进行比较,小数左移,大数右移到原小数的位置
//外层循环,循环比较的数组元素
for($i=0;$i<$len-1;$i++){
//内层循环,循环被比较的数组元素,挑出最小的数
for($j=$i+1;$j<=$len-1;$j++){
if($arr[$i] > $arr[$j]){
$p = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $p;
}
}
}
echo '<pre>';print_r($arr);
}
//其实,以上流程完全可以用一个函数sort()就可解决,简单明了:
$Arr = [4,30,5,3,99,78,100,12,78,3];
sort($Arr);
echo '<pre>';print_r($Arr);
2,杨辉三角
个人理解图示:
public function yanghui($id=6){
$Arr = [];
//1.循环所有行
for($i=1; $i<=$id; $i++){
//行首为1
$Arr[$i][1] = 1;
//2.循环当前行中的列
for($j=1; $j<=$i; $j++){
if($j == $i){
//行尾为1
$Arr[$i][$j] = 1;
echo $Arr[$i][$j];
echo '<br/>';
}else{
//其他数为上一行同位置的数+上一行同位置的前一个数之和
@$Arr[$i][$j] = $Arr[$i-1][$j-1] + $Arr[$i-1][$j];
echo $Arr[$i][$j];
echo ' ';
}
}
}
echo '<pre>';print_r($Arr);
}
3,一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,.输出最后那个大王的编号。
/**
* $n:猴子数量
* $m:被剔出圈的第m只猴子
*/
public function hou($n=11,$m=3){
$Arr = [];
for($i=1;$i<=$n;$i++){
$Arr[] = $i;
}
echo '<pre>';print_r($Arr);
$this->bb($Arr,$m);
}
public function bb($Arr=[],$m=2){
$count = count($Arr);
if(count($Arr)==1){
halt('最终猴王:'.$Arr[0]);
}
if($count < $m){
$mm = $m % $count; //取余数
if($mm == 0){
$mm = $count;
}
}else{
$mm = $m;
}
$kk = -1;
$mowei = [];
foreach($Arr as $key=>$value){
//将$mm位以后的全部移出来
if($kk !== -1){
array_unshift($mowei,$Arr[$key]);
unset($Arr[$key]); //删除此末尾值
}else{
if($key + 1 == $mm){
unset($Arr[$key]);
$kk = $key;
}
}
}
if($mowei){
foreach($mowei as $mo){
//将此值插入Arr数组前面,并重置数组的键值,从0开始
array_unshift($Arr,$mo);
}
}else{
$Arr = array_values($Arr); //重置数组的键值,从0开始
}
// dump($Arr);
$this->bb($Arr,$m);
}
或
function fuhuan($allnum, $ti){
$arr = array();
for($i = 0; $i < $allnum; $i++){
$arr[$i] = $i;
}
$nums = 1;
while(count($arr) > 1){
foreach ($arr as $key => $value) {
if($nums == $ti){
unset($arr[$key]);
$nums = 1;
}else{
$nums++;
}
}
}
$new_arr = array_values($arr);
var_dump($new_arr[0] + 1);
}
fuhuan(11,3);