题解 | #牧场边界巡游#

牧场边界巡游

https://www.nowcoder.com/practice/bc7fe78f7bcc49a8bc0afdd7a55ca810

import java.util.*;

public class Solution {
    public int[] spiralTravelCounterClockwise(int[][] matrix) {
        // 行数
        int m = matrix.length;
        // 列数
        int n = matrix[0].length;
        // 结果List
        List<Integer> res = new ArrayList<>();
        // 记录数组元素是否已取走
        boolean[][] flag = new boolean[m][n];
        // 记录循环次数
        int count = 0;
        // 数组坐标(i,j)
        int i = 0, j = 0;
        // 用于判断方向
        int fx = 0;

        // 逆时针螺旋遍历
        while (count < m * n) {
            // 收集数据
            res.add(matrix[i][j]);
            // 标记
            flag[i][j] = true;
            // 记录循环次数
            count++;

            // 更新方向
            if (fx == 0 && (i + 1 >= m || flag[i + 1][j])) {
                // 向下 且 坐标 i + 1 超过行数(越界) 或者 数据已经被标记
                fx++;
            } else if (fx == 1 && (j + 1 >= n || flag[i][j + 1])) {
                // 向右 且 坐标 j + 1 超过列数(越界) 或者 数据已经被标记
                fx++;
            } else if (fx == 2 && (i - 1 < 0 || flag[i - 1][j ])) {
                fx++;
            } else if (fx == 3 && (j - 1 < 0 || flag[i][j - 1])) {
                fx = 0;
            }

            // 向下
            if (fx == 0) i++;
            // 向右
            else if (fx == 1) j++;
            // 向上
            else if (fx == 2) i--;
            // 向左
            else if (fx == 3) j--;
        }

        // 结果数组
        int[] nums = new int[m * n];
        for (int k = 0; k < nums.length; k++) {
            nums[k] = res.get(k);
        }
        // 返回结果
        return nums;
    }
}

全部评论

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务