逆时针输出数列
如:
代码:
import java.util.*;
/**
* Created by Fay on 2016/9/22.
*/
public class Test {
public static void main(String[] args) {
NumCircle num = new NumCircle(135);
System.out.println(num);
}
}
enum Direction{
UP,DOWN,LEFT,RIGHT
}
class NumCircle {
private Direction direction = Direction.RIGHT;
private int row = 0;
private Map<Integer, LinkedList<Integer>> data = new TreeMap<>();
NumCircle(int max) {
for(int i = 1; i <= max; i++) {
append(i);
}
}
private void append(int num) {
ensure(row);
switch (direction) {
case UP:
if (tryChange()) {
direction = Direction.LEFT;
add(row, num);
} else {
add(row - 1, num);
}
break;
case DOWN:
if (tryChange()) {
direction = Direction.RIGHT;
add(row, num);
} else {
add(row + 1, num);
}
break;
case LEFT:
if (tryChange()) {
direction = Direction.DOWN;
add(row + 1, num);
} else {
add(row, num);
}
break;
case RIGHT:
if (data.get(row).size() < 2) {
add(row, num);
return;
}
if (tryChange()) {
direction = Direction.UP;
add(row - 1, num);
} else {
add(row, num);
}
break;
}
}
private boolean tryChange() {
int len = data.get(row).size();
switch (direction) {
case UP:
ensure(row + 1);
return len < data.get(row + 1).size();
case DOWN:
return len == 1;
case LEFT:
ensure(row + 1);
return (len - data.get(row + 1).size()) == 1;
case RIGHT:
ensure(row - 1);
return len > data.get(row - 1).size();
default:
return true;
}
}
private void add(int row, int num) {
this.row = row;
ensure(row);
if (direction == Direction.UP || direction == Direction.RIGHT) {
data.get(row).addLast(num);
} else {
data.get(row).addFirst(num);
}
}
private void ensure(int row) {
if (data.get(row) == null) {
LinkedList<Integer> temp = new LinkedList<>();
data.put(row, temp);
}
}
public String toString() {
Set<Integer> keys = data.keySet();
StringBuilder sb = new StringBuilder();
int max = 0;
for (int i : keys) {
if (data.get(i).size() > max) {
max = data.get(i).size();
}
}
for (Integer i : keys) {
LinkedList<Integer> linkedList = data.get(i);
for(int j = 0; j < (max - linkedList.size()); j++) {
sb.append(" ");
}
for (int num : linkedList) {
sb.append(String.format("%-4d", num));
}
sb.append("\r\n");
}
return sb.toString();
}
}