48. Rotate Image

前言

嗯,今天国庆节哦。

最近碰上了两道难度为困难的题,做的自己有点怀疑人生,整天无精打采的。首先是谷歌那道面试题,Super Egg Drop  ,这题我就压根没看懂啥意思,最后大体上明白了应该就是给你几个鸡蛋,你要用手里的鸡蛋确定这个特殊的F层楼在第几层,你要一层层的扔鸡蛋,最后就是无论这个F是第几层,你要用你手里的鸡蛋都能确定的最小的移动步数(不过我还是怀疑我没有看懂,所以就没在做了)。其次是一个 Split Array With Same Average ,这题不光需要你的编程知识,还需要简单的数学推论,最后我能学到的就是

如果数组能划分为两个均值相等的数组,那么子数组的平均数和该数组的是相等的。

好了,来看看今天的题目吧:

描述

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Note:

You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.

原地顺时针旋转一个矩阵

ac代码

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {debugger;
    let L = matrix.length,
        circle = L*4 - 4,
        row = L,
        col = L;
    
        

    let startIndex = 0;//是开始的坐标,也是当前开始的行数
    while( circle > 1 ){
        let nextValue,
            curCol = curRow = startIndex;
        for(let i = 0 ;i < row -1;i++ ){
            for( let iterator = 0; iterator < circle ;iterator++){

                // 下
                if( curCol == (col+startIndex-1) && curRow !==( row+startIndex-1 ) ){

                    let temp = nextValue;
                    nextValue=matrix[curRow+1][curCol];
                    matrix[curRow+1][curCol] = temp;
                    curRow++;
                    continue;   
                }

                // 左
                if( curRow ==( row+startIndex-1 ) && ( curCol !== startIndex ) ){
                    let temp = nextValue;
                    nextValue=matrix[curRow][curCol-1];
                    matrix[curRow][curCol-1] = temp;
                    curCol--;
                    continue; 
                }

                // 上
                if( ( curCol == startIndex ) && ( curRow !== startIndex ) ){
                    let temp = nextValue;
                    nextValue=matrix[curRow-1][curCol];
                    matrix[curRow-1][curCol] = temp;
                    curRow--;
                    if( curRow == startIndex ){
                        nextValue = undefined;
                        break;
                    }
                    continue;
                }

                // 右
                if( typeof (nextValue) !== 'undefined' ){
                    let temp = nextValue;
                    nextValue=matrix[curRow][curCol+1];
                    matrix[curRow][curCol+1] = temp;
                    curCol++;
                }else{
                    nextValue = matrix[curRow][curCol+1];
                    matrix[curRow][curCol+1] =  matrix[curRow][curCol];
                    curCol++;
                }

            }        
        }
        row -=2;
        col -= 2;
        circle = 4 * ( row-1 );
        startIndex++;
    }
};

思路

我的思路是把这个矩阵看成一圈一圈的方圈,实际上旋转90度就是把每个圈转 (圈长度 -1)次,

从外向里依次旋转

像贪吃蛇游戏一样,真的

既然是游戏

旋转的时候就是各种边界值的判定啦

有个小技巧是要把接下来旋转的值保存一下

就酱

posted @ 2018-10-01 08:06  子龙_子龙  阅读(11)  评论(0编辑  收藏  举报