数独&&扑克牌顺序&&第一次只出现一次的字符

228 阅读1分钟

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