lintcode 3605 · 二维网格偏移 【数组相关,模拟即可】

题目

https://www.lintcode.com/problem/3605

给定一个 m 行 n 列的二维网格 grid 和一个整数 k,需要将 grid 偏移 k 次,偏移规则如下:

位于 grid[i][j] 的元素移动到 grid[i][j + 1]
位于 grid[i][n - 1] 的元素移动到 grid[i + 1][0]
位于 grid[m - 1][n - 1] 的元素移动到 grid[0][0]
偏移操作为一次性完成,以上三个规则不会造成数据覆盖,返回偏移 k 次之后的二维网格。


样例
样例13605_1.png

输入:grid = [[1,2,3],[4,5,6],[7,8,9]]  k = 1
输出:[[9,1,2],[3,4,5],[6,7,8]]
样例23605_2.png

输入:grid = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]  k = 2
输出:[[11,12,1,2],[3,4,5,6],[7,8,9,10]]

思路

其实就是数组中的每个数依次往后移动k个位置,
最后的k个数填充到数组开头,倒数第k个放数组第一个,
倒数第k-1个放第二个位置,以此类推

参考答案

public class Solution {
    /**
     * @param grid: m*n matrix
     * @param k: Number of shifts
     * @return: m*n matrix after shift
     */
    public int[][] shiftGrid(int[][] grid, int k) {
         //根据题意,每一次移动,
        // 其实就是把每一行的最后一个数移动到下一行的第一个数的位置
        //最后一个数移动到开数组头位置
        //那么:移动k次,就是每个数依次往后移动k个位置,结尾的数,移动到开头
        int n= grid.length,m= grid[0].length;
        int len = n*m;
        int[][] ans = new int[n][m];


        for (int i = 0; i <len-k ; i++) {  //先填充k到n*m之间的单元格
            int x = i/m;
            int y = i -x*m;


            int index = i+k;
            int x1 = index/m;
            int y1 = index-x1*m;
            ans[x1][y1] = grid[x][y];
        }

        int end = k-1;
        for (int i =len-1 ; i >len-k-1 ; i--) { //最后的k个数要移动到开头
            int x = i/m;
            int y = i -x*m;

            int x1 = end/m;
            int y1 = end-x1*m;
            end--;
            ans[x1][y1] = grid[x][y];
        }

        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵长辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值