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;
}
}