PHP 面试风车算法
最近在面试的过程中遇到了一个挺有意思的 面试题, 让写一个 函数 效果如下:
1 | foo(4); // 调用函数foo 传参数 效果如下: |
按照上面的结果,分析了下整了如下函数:
1 | /** |
其中原理是把效果按照 坐标的形式去处理,比如:
1 | foo(4) 按照坐标化处理就是: |
然后我们通过 create_struct() 函数去组合一下 坐标:
1 | array (size=16) |
从算法结果要求对比我们会发现旋转的最后一个值我们是知道的:
1 | /** |
也就是最后一个值 是 $num*$num 最后一个值的坐标是 (1,$num)
接下来我们遍历坐标倒着把外圈的先整出来,代码如下:
1 | $data = new stdClass(); //PHP内置类 用来返回特定的数据结构 |
运行这段代码如下:
1 | object(stdClass)[1] |
得到一个对象有开始 坐标 有 最后一个 点的值 然后我们开始用 change_key() 函数迭代,先给 1,4 坐标分配一个 16 代码如下:
1 | $key = change_key($data, $direction); |
然后在 change_key() 递归调用 填充 , 依次 向右走->向上->向左-> 向下 这样 得到数据如下:
1 | object(stdClass)[1] |
接下来一行一行的排列了代码如下:
1 | $data->struct = create_struct($num); |
结果如下:
1 | object(stdClass)[1] |
最后 把 $data->struct 属性 按照 $num 进行分组就 ok了.