顺序表例题

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;
}

 6.归并顺序表 : 两个顺序表都是非递减有序排列,归并之后的顺序表仍然是有序的

/**
 * 顺序表归并
 * @param array $listA 待归并的顺序表
 * @param array $listB 待归并的顺序表
 * @param mixed 
 */
function mergeSqList($listA, $listB) {
    if(!is_array($listA) || !is_array($listB)) return false;
    $merge = [];
    $A = 0; // $listA的工作指针
    $B = 0; // $listB的工作指针
    $M = 0; // $merge的工作指针
    $lenA = count($listA);
    $lenB = count($listB);
    // 归并
    while ($A < $lenA && $B < $lenB) {
        if($listA[$A] < $listB[$B]) {
            $merge[$M++] = $listA[$A++];
        } else {
            $merge[$M++] = $listB[$B++];
        }
    }
    // A有冗余
    while ($A < $lenA) {
        $merge[$M++] = $listA[$A++];
    }
    // B有冗余
    while ($B < $lenB) {
        $merge[$M++] = $listB[$B++];
    }
    return $merge;
}
/**
 * 使用PHP自带的函数实现
 */
function mergePHP($listA, $listB) {
    sort($listA);
    sort($listB);
    $merge = array_merge($listA, $listB);
    sort($merge);
    return $merge;
}

 

转载于:https://www.cnblogs.com/rwqzcq/p/7500754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值