算法題練習(8.19~8.25)

8.19-8.25
ZigZag Conversion https://leetcode.com/problems/zigzag-conversion/
Rotate Image https://leetcode.com/problems/rotate-image/
Sqrt(x) <https://leetcode.com/problems/sqrtx/
Symmetric Tree https://leetcode.com/problems/symmetric-tree/ 
Longest Increasing Subsequence https://leetcode.com/problems/longest-increasing-subsequence/

1 字符串Z字形變換


    public String convert(String s, int numRows) {

        if (numRows == 1) {
            return s;
        }

        List<StringBuilder> rows = new ArrayList<>();

        for (int i = 0; i < Math.min(numRows, s.length()); i++) {
            rows.add(new StringBuilder());
        }

        int curRow = 0;
        boolean goDomn = false;

        for (char c : s.toCharArray()) {
            rows.get(curRow).append(c);
            if (curRow == 0 || curRow == numRows - 1) {
                goDomn = !goDomn;
            }

            curRow += goDomn ? 1 : -1;
        }

        StringBuilder res = new StringBuilder();
        for (StringBuilder row : rows) {
            res.append(row);
        }

        return res.toString();

    }

2 旋轉圖像

public class RotateImg_48 {

    public void rotate(int[][] matrix) {
        int tR = 0;
        int tC = 0;
        int dR = matrix.length - 1;
        int dC = matrix[0].length - 1;

        while (tR < dR) {
            rotateEdge(matrix, tR++, tC++, dR--, dC--);
        }

    }

    private void rotateEdge(int[][] matrix, int tR, int tC, int dR, int dC) {
        // 總的組數
        int times = dC - tC;

        int tmp = 0;

        // 一次循環就是一組調整
        for (int i = 0; i != times; i++) {
            tmp = matrix[tR][tC + i];
            matrix[tR][tC + i] = matrix[dR - i][tC];
            matrix[dR - i][tC] = matrix[dR][dC - i];
            matrix[dR][dC - i] = matrix[tR + i][dC];
            matrix[tR + i][dC] = tmp;
        }

    }
}

3 x 的平方根

public int mySqrt(int x) {
        if (x == 1 || x == 0) {
            return x;
        }
        int start = 1;
        int end = x / 2 + 1;

        int mid = 0;

        while (start <= end) {
            mid = start + (end - start) / 2;
            if (mid <= x / mid && (mid + 1) > x / (mid + 1)) {
                return mid;
            }

            if (mid > x / mid) {
                end = mid - 1;
            } else {
                start = mid + 1;
            }

        }

        return mid;

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章