資料結構與演算法---螺旋矩陣、整數反轉

iOS_Asia發表於2020-11-25

螺旋矩陣

54. 螺旋矩陣
給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。

示例 1:輸入:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

輸出: [1,2,3,6,9,8,7,4,5]

示例 2:輸入:

[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]

輸出: [1,2,3,4,8,12,11,10,9,5,6,7]


思路

需要定義四個變數:
top、bottom、left、right
需要注意的地方:行數為奇數或偶數

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix == null) return null;
        List<Integer> array = new ArrayList<>();
        if(matrix.length == 0) return array;
        if(matrix[0].length == 0) return array;

        int top = 0;
        int bottom = matrix.length - 1;
        int left = 0;
        int right = matrix[0].length - 1;

        while(left <= right && top <= bottom){
            for(int i = left; i<=right; i++){
                array.add(matrix[top][i]);
            }
            top++;
            if(left > right || top > bottom) break;
            
            for(int i = top; i<=bottom; i++){
                array.add(matrix[i][right]);
            }
            right--;
            if(left > right || top > bottom) break;

            for(int i = right; i>=left; i--){
                array.add(matrix[bottom][i]);
            }
            bottom--;
            if(left > right || top > bottom) break;

            for(int i = bottom; i>=top; i--){
                array.add(matrix[i][left]);
            }
            left++;
            if(left > right || top > bottom) break;
        }
        return array;
    }
}

整數反轉

7. 整數反轉

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

示例 1:
輸入: 123
輸出: 321

示例 2:
輸入: -123
輸出: -321

示例 3:
輸入: 120
輸出: 21

注意:
假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。


思路

1234
1234 % 10 = 4得到個位數4
1234 / 10 = 123得到剩餘的數
123 % 10 = 3得到個位數
result = (((4 * 10) + 3) * 10 + 2) * 10 + 1
result = 4000 + 300 + 20 + 1 = 4321

關於溢位,可以使用long型別,然後返回的時候再強轉為int

class Solution {
    public int reverse(int x) {
        long result = 0;
        while(x != 0){
            result = result * 10 + x % 10;
            if(result > Integer.MAX_VALUE) return 0;
            if(result < Integer.MIN_VALUE) return 0;
            x = x/10;
        }
        return (int)result;
    }
}

或者

class Solution {
    public int reverse(int x) {
        int result = 0;
        while(x != 0){
            int pre = result;
            result = pre * 10 + x % 10;
            if((result - x % 10)/10 != pre) return 0;
            x = x/10;
        }
        return result;
    }
}

相關文章