NC47 数独
1、解题思路
使用DFS求解。在回溯的时候需要判断是否已找到结果,找到结果只会就不需要再回溯了。
2、代码
public class Solution {
private boolean hasFindAns = false;
private boolean check(int r, int c, char val, char[][] board) {
int startR = r / 3 * 3;
int startC = c / 3 * 3;
for (int i = 0; i <= 8; i++) {
if (board[r][i] == val || board[i][c] == val) {
return false;
}
}
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 2; j++) {
if (board[i + startR][j + startC] == val) {
return false;
}
}
}
return true;
}
private void dfs(int index, char[][] board) {
int r = index / 9;
int c = index % 9;
if (r == 9 && c == 0) {
hasFindAns = true;
} else if (board[r][c] != '.') {
dfs(index + 1, board);
} else {
for (char val = '1'; val <= '9'; val++) {
if (hasFindAns) {
break;
}
if (check(r, c, val, board)) {
board[r][c] = val;
dfs(index + 1, board);
if (!hasFindAns) {
board[r][c] = '.';
}
}
}
if (!hasFindAns) {
board[r][c] = '.';
}
}
}
public void solveSudoku(char[][] board) {
dfs(0, board);
}
}
NC63 扑克牌顺序
1、解题思路
## 有几个规则吧
1. 出现重复 直接返回false 0重复不算
2. 在第一步的前提下,最大值和最小值差 小于等4 返回true
2、代码
public class Solution {
public boolean IsContinuous(int [] numbers) {
int maxV = -1;
int minV = 14;
int[] vis = new int[14];
for (int number : numbers) {
if (vis[number] == 1 && number != 0) {
return false;
}
vis[number] = 1;
if (number > maxV) {
maxV = number;
}
if (number < minV && number != 0) {
minV = number;
}
}
return maxV - minV <= 4;
}
}
NC31 第一次只出现一次的字符
1、解题思路
数组标记一下就可以了。
2、代码
public class Solution {
public int FirstNotRepeatingChar(String str) {
int[] cnt = new int[200];
char[] chars = str.toCharArray();
for (char aChar : chars) {
cnt[aChar]++;
}
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
if (cnt[ch] == 1) {
return i;
}
}
return -1;
}
}