逆时针输出数列

逆时针输出数列

如:这里写图片描述

代码:

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();
    }
}
逆时针输出通常是指在一个二维数组(如矩形网格)中按照逆时针方向遍历并输出所有元素的过程。这里我们假设有一个 `m x n` 的矩阵,从最外层开始逐圈按逆时针顺序读取各元素直到整个矩阵都被访问过为止。 下面是一个简单的C++示例代码,它演示了如何实现这样一个功能: ```cpp #include <iostream> #include <vector> using namespace std; // 函数用于逆时针打印矩阵中的值 void printAntiClockwise(const vector<vector<int>>& matrix) { if (matrix.empty()) return; int top = 0, bottom = matrix.size() - 1; int left = 0, right = matrix[0].size() - 1; while (top <= bottom && left <= right) { // 左下到左上 for (int i = bottom; i >= top; --i) cout << matrix[i][left] << ' '; left++; // 右上到左上 for (int i = left; i <= right; ++i) cout << matrix[top][i] << ' '; top++; // 右下到右上 if (top <= bottom) { // 确保不是单行的情况 for (int i = top; i <= bottom; ++i) cout << matrix[i][right] << ' '; right--; } // 左下到右下 if (left <= right) { // 确保不是单列的情况 for (int i = right; i >= left; --i) cout << matrix[bottom][i] << ' '; bottom--; } } } int main(){ vector<vector<int>> matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; cout << "原始矩阵:\n"; for(auto& row : matrix){ for(int val : row) cout << val << "\t"; cout << endl; } cout << "\n逆时针输出的结果是:\n"; printAntiClockwise(matrix); return 0; } ``` 在这个例子中,我们首先设置了四个边界变量 (`top`, `bottom`, `left`, 和 `right`) 来界定每次迭代时待处理区域的位置。然后在每个循环周期里分别沿着四条边进行移动,并调整相应的边界条件以便进入下一个内部层次继续同样的过程直至完成全部数据的输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值