Skip to content

Commit 9ceb4d9

Browse files
committed
更新风车旋转排序算法
1 parent 0214789 commit 9ceb4d9

File tree

3 files changed

+168
-0
lines changed

3 files changed

+168
-0
lines changed

README-EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
│ └── Judge.php
7171
│ └── Factorial.php
7272
| └── HashTable.php
73+
| └── RotateSort.php
7374
7475
├──LICENSE
7576
└──README.md

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
│ └── Judge.php 面试题之扑克牌中任选五张判断是不是顺子
8686
│ └── Factorial.php 面试题之N的阶乘末尾有多少个0
8787
| └── HashTable.php HashTable
88+
| └── RotateSort.php 面试题之风车旋转排序算法
8889
8990
├──LICENSE
9091
└──README.md

src/Other/RotateSort.php

+166
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
<?php
2+
/**
3+
* ----------------------------------------
4+
* | Created By algorithm-php |
5+
* | User: 南丞 <[email protected]> |
6+
* | Date: 2019/10/11 |
7+
* | Time: 下午2:56 |
8+
* ----------------------------------------
9+
* | _____ ______ _ _ |
10+
* | | __ \| ____(_) | | |
11+
* | | |__) | |__ _ _ __ __ _| | |
12+
* | | ___/| __| | | '_ \ / _` | | |
13+
* | | | | | | | | | | (_| | | |
14+
* | |_| |_| |_|_| |_|\__,_|_| |
15+
* ----------------------------------------
16+
* 说明: 面试遇到一个写一个函数 让输出效果 如风车一样旋转 如下
17+
* foo(4) 逆时针
18+
* 16,15,14,13
19+
* 5, 4, 3, 12
20+
* 6, 1, 2, 11
21+
* 7, 8, 9, 10
22+
* foo(4) 顺顺时针
23+
* 7, 8, 9, 10
24+
* 6, 1, 2, 11
25+
* 5, 4, 3, 12
26+
* 16,15, 14,13
27+
*
28+
*/
29+
30+
$num = 4;
31+
$arr = foo($num);
32+
for ($i = 0; $i < $num; $i++) {
33+
echo implode(',', $arr[$i])."<br>";
34+
}
35+
36+
/**
37+
* @param $num
38+
* @param int $direction 方向 1 为 顺时针旋转 2 为逆时针旋转
39+
* @return mixed
40+
*/
41+
function foo($num, $direction = 1)
42+
{
43+
//填充map
44+
$data = new stdClass();
45+
$data->x = 1;
46+
if ($direction == 1) {
47+
$data->y = $num;
48+
} elseif ($direction == 2) {
49+
$data->y = 1;
50+
}
51+
$data->num = $num;
52+
$data->len = $num * $num;
53+
$data->tmp_data = [];
54+
$data->rate = 1;//方向
55+
$data->struct = create_struct($num);
56+
for ($i = $data->len; $i >= 1; $i--) {
57+
$data->i = $i;
58+
$key = change_key($data, $direction);
59+
$data->tmp_data[$key] = $i;
60+
unset($data->struct[$key]);
61+
}
62+
63+
//根据y坐标分组
64+
$data->struct = create_struct($num);
65+
foreach ($data->tmp_data as $key => $value) {
66+
$data->struct[$key] = $value;
67+
}
68+
for ($i = 1; $i <= $data->num; $i++) {
69+
$start = ($i - 1) * $data->num;
70+
$end = $data->num;
71+
$slice = array_slice($data->struct, $start, $end);
72+
$data->slice[] = $slice;
73+
}
74+
75+
return $data->slice;
76+
}
77+
78+
function create_struct($num)
79+
{
80+
$struct = [];
81+
for ($i = 1; $i <= $num; $i++) {
82+
//嵌套
83+
for ($m = 1; $m <= $num; $m++) {
84+
$key = $m.','.$i;
85+
$struct[$key] = '';
86+
}
87+
}
88+
89+
return $struct;
90+
}
91+
92+
function change_key($data, $direction)
93+
{
94+
$key = $data->x.','.$data->y;
95+
if (isset($data->struct[$key])) {
96+
return $key;
97+
}
98+
switch ($data->rate) {
99+
// LEFT 方向
100+
case 1:
101+
$data->tmp_x = $data->x + 1;
102+
$key = $data->tmp_x.','.$data->y;
103+
if (isset($data->struct[$key])) {
104+
$data->x = $data->tmp_x;
105+
106+
return $key;
107+
} else {
108+
if ($direction = 1) {
109+
$data->rate = 4;
110+
} elseif ($direction = 2) {
111+
$data->rate = 2;
112+
}
113+
}
114+
break;
115+
// DOWN 方向
116+
case 2:
117+
$data->tmp_y = $data->y + 1;
118+
$key = $data->x.','.$data->tmp_y;
119+
if (isset($data->struct[$key])) {
120+
$data->y = $data->tmp_y;
121+
122+
return $key;
123+
} else {
124+
if ($direction = 1) {
125+
$data->rate = 1;
126+
} elseif ($direction = 2) {
127+
$data->rate = 3;
128+
}
129+
}
130+
break;
131+
// RIGHT 方向
132+
case 3:
133+
$data->tmp_x = $data->x - 1;
134+
$key = $data->tmp_x.','.$data->y;
135+
if (isset($data->struct[$key])) {
136+
$data->x = $data->tmp_x;
137+
138+
return $key;
139+
} else {
140+
if ($direction = 1) {
141+
$data->rate = 2;
142+
} elseif ($direction = 2) {
143+
$data->rate = 4;
144+
}
145+
}
146+
break;
147+
// UP 方向
148+
case 4:
149+
$data->tmp_y = $data->y - 1;
150+
$key = $data->x.','.$data->tmp_y;
151+
if (isset($data->struct[$key])) {
152+
$data->y = $data->tmp_y;
153+
154+
return $key;
155+
} else {
156+
if ($direction = 1) {
157+
$data->rate = 3;
158+
} elseif ($direction = 2) {
159+
$data->rate = 1;
160+
}
161+
}
162+
break;
163+
}
164+
165+
return change_key($data, $direction);
166+
}

0 commit comments

Comments
 (0)