逆时针输出数列

逆时针输出数列

如:这里写图片描述

代码:

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值