括号生成&&顺时针旋转矩阵&&数字字符串转化为IP地址

174 阅读1分钟

NC26 括号生成

题目链接

1、解题思路

深搜的思想,每到一个位置,判断可以不可以放左括号和右括号。如果左右括号都放完了,加入到List中即可。

2、代码
import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 
     * @return string字符串ArrayList
     */
    private void dfs(ArrayList<String> list, int n, StringBuilder sb, int left, int right) {
        if (left == right) {
            if (left == n && right == n) {
                list.add(sb.toString());
            } else {
                StringBuilder stringBuilder = new StringBuilder(sb);
                stringBuilder.append("(");
                dfs(list, n, stringBuilder, left + 1, right);
            }
        } else {
            if (left < n) {
                StringBuilder stringBuilder = new StringBuilder(sb);
                stringBuilder.append("(");
                dfs(list, n, stringBuilder, left + 1, right);
            }
            if (right < n) {
                StringBuilder stringBuilder = new StringBuilder(sb);
                stringBuilder.append(")");
                dfs(list, n, stringBuilder, left, right + 1);
            }
        }
    }

    public ArrayList<String> generateParenthesis(int n) {
        // write code here
        ArrayList<String> list = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        dfs(list, n, sb, 0, 0);
        return list;
    }
}

NC18 顺时针旋转矩阵

题目链接

1、解题思路

感觉这个题目真tn的坑爹,把左边的那一列数组保存,然后旋转就好,注意细节。

2、代码
import java.util.*;

public class Solution {
    public int[][] rotateMatrix(int[][] mat, int n) {
        int lR = 0;
        int lC = 0;
        int rR = n - 1;
        int rC = n - 1;
        while (lR < rR) {
            int[] temp = new int[rR - lR + 1];
            int index = 0;
            for (int i = lR; i <= rR; i++) {
                temp[index++] = mat[i][lC];
            }
            for (int i = lR; i <= rR; i++) {
                mat[i][lC] = mat[rR][i - lR + lC];
            }
            for (int i = lC; i <= rC; i++) {
                mat[rR][i] = mat[rR - (i - lC)][rC];
            }
            for (int i = rR; i >= lR; i--) {
                mat[i][rC] = mat[lR][rC - (rR - i)];
            }
            for (int i = rC; i >= lC; i--) {
                mat[lR][i] = temp[rC - i];
            }
            lR++;
            lC++;
            rR--;
            rC--;
        }
        return mat;
    }
}

NC20 数字字符串转化为IP地址

题目链接

1、解题思路

dfs,和括号生成类似,但是这个题目需要判断是否合法比较繁琐,必须严格分割字符串。

2、代码
import java.util.*;


public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return string字符串ArrayList
     */
    private void dfs(ArrayList<String> list, String s, StringBuilder sb, int index) {
        if (index == s.length()) {
            String str = sb.toString();
            if (str.split("\\.").length > 4) {
                return;
            } else if (str.split("\\.").length == 4) {
                String[] split = str.split("\\.");
                for (int i = 0; i < split.length; i++) {
                    String string = split[i];
                    if (string.charAt(0) == '0' && string.length() != 1) {
                        return;
                    }
                    Integer integer = Integer.valueOf(string);
                    if (integer < 0 || integer > 255) {
                        return;
                    }
                }
                list.add(str);
            }
        } else {
            StringBuilder stringBuilder1 = new StringBuilder(sb);
            stringBuilder1.append(".");
            stringBuilder1.append(s.charAt(index));
            dfs(list, s, stringBuilder1, index + 1);

            StringBuilder stringBuilder2 = new StringBuilder(sb);
            stringBuilder2.append(s.charAt(index));
            dfs(list, s, stringBuilder2, index + 1);

        }
    }

    public ArrayList<String> restoreIpAddresses(String s) {
        // write code here
        ArrayList<String> list = new ArrayList<>();
        if(s.length() == 0){
            return list;
        }
        StringBuilder sb = new StringBuilder();
        sb.append(s.charAt(0));
        dfs(list, s, sb, 1);
        return list;
    }
}