算法面试题-构造一个数组成为风车型排列

算法面试题-构造一个数组成为风车型排列

在这里插入图片描述

实现一个 function foo($num) 函数,依照一下例子类推,组成一个风车型排列;

// foo(1) = [[1]];
// foo(2) = [ [1,2]
//            [4,3]  ];
// foo(3) = [ [7,8,9]
//            [6,1,2]
//            [5,4,3] ];
// foo(4) = [ [7,8,9,10]
//            [6,1,2,11]
//            [5,4,3,12]
//            [16,15,14,13] ];
//
// foo(5) = [ [21,22,23,24,25]
//            [20,7,8,9,10]
//            [19,6,1,2,11]
//            [18,5,4,3,12]
//            [17,16,15,14,13] ];

题目详情

$num = 10;
$arr = foo($num);
for ($i = 0; $i < $num; $i++) {
    echo implode(", ", $arr[$i]) . "\n";
}
function foo ($num)  {
    # TODO 实现代码
    return [[1, 2], [4, 3]];
}

个人实现的逻辑

function foo($num)
{
    $i = 0;
    while ($i < $num) {
        $result[] = [];
        $i++;
    }
    $isTop = true;
    $lastRaw = intval(($num + 1) / 2) - 1;
    $result[$lastRaw][] = 1;

    $i = 2;
    $lastValue = 2;
    while ($i <= $num) {
        if ($isTop) {
            # 开始往右
            $temp = $result[$lastRaw];
            array_push($temp, $lastValue);
            $lastValue++;
            $result[$lastRaw] = $temp;
            # 往下
            $j = 1;
            while ($j < $i) {
                $temp = $result[$lastRaw + $j];
                array_push($temp, $lastValue);
                $lastValue++;
                $result[$lastRaw + $j] = $temp;
                $j++;
            }
            $lastRaw = $lastRaw + $j - 1;
            # 往左
            $k = 1;
            $temp = $result[$lastRaw];
            while ($k < $i) {
                array_unshift($temp, $lastValue);
                $lastValue++;
                $k++;
            }
            $result[$lastRaw] = $temp;
        } else {
            # 开始往左
            $temp = $result[$lastRaw];
            array_unshift($temp, $lastValue);
            $lastValue++;
            $result[$lastRaw] = $temp;
            # 往上
            $j = 1;
            while ($j < $i) {
                $temp = $result[$lastRaw - $j];
                array_unshift($temp, $lastValue);
                $lastValue++;
                $result[$lastRaw - $j] = $temp;
                $j++;
            }
            $lastRaw = $lastRaw - $j + 1;
            # 往右
            $k = 1;
            $temp = $result[$lastRaw];
            while ($k < $i) {
                array_push($temp, $lastValue);
                $lastValue++;
                $k++;
            }
            $result[$lastRaw] = $temp;
        }
        $isTop = !$isTop;
        $i++;
    }
    return $result;
}

网络搜索

function foo($num){
    //填充map
    $data = new stdClass();
    $data->x = 1;
    $data->y = 1;
    $data->num = $num;
    $data->len = $num * $num;
    $data->tmp_data = [];
    $data->rate = 1;//方向
    $data->struct = create_struct($num);

    for ($i = $data->len;$i>=1;$i--){
        $data->i = $i;
        $key = change_key($data);
        $data->tmp_data[$key] = $i;
        unset($data->struct[$key]);
    }
    //根据y坐标分组
    $data->struct = create_struct($num);
    foreach ($data->tmp_data as $key=> $value){
        $data->struct[$key]= $value;
    }

    for ($i=1;$i<=$data->num;$i++){
        $start = ($i - 1)*$data->num;
        $end = $data->num;
        $slice = array_slice($data->struct,$start,$end);
        $data->slice[] = '['.implode(",", $slice).']';
    }
    return $data->slice;
}
function change_key($data){
    //check key
    $key = $data->x.','.$data->y;
    if(isset($data->struct[$key])){
        return $key;
    }
    switch ($data->rate)
    {
        case 1:
            //left
            $data->tmp_x = $data->x + 1;
            $key = $data->tmp_x.','.$data->y;
            if(isset($data->struct[$key])){
                $data->x = $data->tmp_x;
                return $key;
            }else{
                $data->rate=2;
                $data->y = $data->y+1;
            }

        break;

        case 2:
            //down
            $data->tmp_y = $data->y + 1;
            $key = $data->x.','.$data->tmp_y;
            if(isset($data->struct[$key])){
                $data->y = $data->tmp_y;
                return $key;
            }else{
                $data->rate=3;
            }
        break;

        case 3:
            //right
            $data->tmp_x = $data->x - 1;
            $key = $data->tmp_x.','.$data->y;
            if(isset($data->struct[$key])){
                $data->x = $data->tmp_x;
                return $key;
            }else{
                $data->rate=4;
            }
            break;

        case 4:
            //up
            $data->tmp_y = $data->y - 1;
            $key = $data->x.','.$data->tmp_y;
            if(isset($data->struct[$key])){
                $data->y = $data->tmp_y;
                return $key;
            }else{
                $data->rate=1;
            }
            break;
    }
    return change_key($data);
}
function create_struct($num){
    $struct = [];
    for ($i=1;$i<=$num;$i++){
        //嵌套
        for($m=1;$m<=$num;$m++){
            $key = $m . ','. $i;
            $struct[$key] = '';
        }
    }
    return $struct;
}
function dump($data){
    echo '<pre>';
    print_r($data);
    echo '</pre>';
    echo '<br>';
}

猜你喜欢

转载自blog.csdn.net/weixin_43208484/article/details/101305986
今日推荐