1.顺序表原地逆置
function Reverse(&$sqList) { $head = 0; // 头 $len = count($sqList); $rear = $len - 1; // 尾 $temp = ‘‘; for ($head = 0; $head < $len && $head < $rear; $head++, $rear--) { $temp = $sqList[$head]; $sqList[$head] = $sqList[$rear]; $sqList[$rear] = $temp; } } // 也可以使用PHP自带的array_reverse()函数,但是这个函数会把最终的结果返回,原数组不变
2.Josephus问题
function Josephus1($len, $start, $num) { /* 顺序表初始化 */ $people = []; for($i = 0; $i < $len; $i++) { $people[$i] = $i + 1; } $order = []; $count = count($order); $index = $start - 1;// 数组下标 $flag = 0; // 指针 /** * 每次出去一个元素 $count加1,当count == 数组长度的时候结束循环 */ while($count < $len) { if($people[$index] != 0) { // 首先从起始位置开始 $flag++; // 指针下移 } if($flag == $num) { // 偏移量到指定的 $flag = 0; // 指针归位 $order[] = $people[$index]; $count++; $people[$index] = 0; } $index++; if($index == $len) { // 遍历顺序表到头,重新再次遍历 $index = 0; } } return $order; }
3.假定数组A中有多个零元素,试写出一个函数,将A中所有的非零元素依次移动到数组A的前端A[i](o<=i && i<=数组长度 )
function removeToHead(&$arr) { $len = count($arr); for ($i = 0, $j = 0; $i < $len; $i++) { if ($arr[$i] != 0) { $temp = $arr[$j]; // 要移动开的位置 $arr[$j] = $arr[$i]; $arr[$i] = $temp; $j++; } else { continue; } } }
4.编写函数,将有一个n个非零元素的整数一维数组A[n]拆分成两个一维数组,使得A[]中大于零的元素存放在B[]中,小于0的元素存放在C[]中
/** * 数组拆分 * @param array $A 待拆分的数组 * @return array $res 二维数组 */ function takePartZero($A) { // 查找非0元素的位置 $index = array_filter($A, function($e){ return $e != 0; }); $index = array_keys($index); // 查找大于0元素的位置 $bigger = array_filter($A, function($e) { return $e > 0; }); $bigger = array_keys($bigger); // 查找小于0元素的位置 $smaller = array_keys(array_filter($A, function($e){ return $e < 0; })); // 存放结果 $res = []; $res[‘B‘] = []; $res[‘C‘] = []; foreach ($bigger as $v) { $res[‘B‘][] = $A[$v]; } foreach ($smaller as $v) { $res[‘C‘][] = $A[$v]; } return $res; }
5.已知在一维数组A[m+n]中依次存放着两个线性表(a0, a1, a2.....am-1)和(b0, b1, b2, ......bn-1)。尝试编写一个函数,将数组中的两个顺序表的位置互换
/** * 顺序表位置互换 * @param array $A 存放着两个顺序表的数组 * @param int $m 第一个线性表的长度 * @param int $n 第二个线性表的长度 * @return array 位置互换之后的数组 */ function listReverse($A, $m, $n) { include ‘SqList.class.php‘; // 引入自己写的顺序表类 $sqList = new sqList($A); $len = count($A); for ($i=$m, $j=1; $i < $len; $i++, $j++) { $temp = $A[$i]; // 删除 $sqList->listDelete($i+1); // 注意删除的是从1开始 // 插入 $sqList->listInsert($j, $temp); } return $sqList->list; }
时间: 2024-10-15 00:16:44