8.10 哈希表简单&中等 202 Happy Number 36 Valid Sudoku

202 Happy Number

在这里插入图片描述在这里插入图片描述

  • 没有对 重点是什么时候返回false 这个问题做出好的回答
  • 这道题核心找少了,他说如果平方和不为1,就会产生循环,所以判定一个数不是happy数就看他是否存在循环。我这个方法有些投机取巧了,不是完整的,看下方链接中的思路。
  • 循环的话按照快慢指针【题解】使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为 1 引起的循环,是的话就是快乐数,否则不是快乐数。
class Solution {
public:
    int SquareSum(int n){
        //得到各个位并相加
        int sum = 0;
        while(n){
            int x = n%10;
            sum += x*x;
            n/=10;
        }
        return sum;
    }
    bool isHappy(int n) {
        //φ(゜▽゜*)♪数
        //判断一个数n是否happy
        //1. replace the number by the sum of the squares of its digits.
        //直到它能够给出结果为1 那就是happy否则不happy
        //contains --> 使用int足够
        //当结果为个位数且此时他不为1 or 7(7是提交时报的错加进来的),就不可能是happy数,重点是什么时候返回false
        while(n){
            if(n/10 == 0){
                if(n == 1 || n == 7){
                    return true;
                }else{
                    return false;
                }
            }
            n = SquareSum(n);
        }
        return 0;
    }
};
//不愧是快乐数,我快乐了哈哈哈哈

36 Valid Sudoku

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    bool SubCheck(int row, int col, vector<vector<char>>& board) {
        vector<int> count(9, 0); // 在每次调用SubCheck时初始化count数组
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                char digit = board[row + i][col + j];
                if (digit != '.') {
                    int index = digit - '0' - 1;
                    count[index]++;
                    if (count[index] > 1) return false;
                }
            }
        }
        return true;
    }

    bool isValidSudoku(vector<vector<char>>& board) {
        //有效数独 in 9*9 size
        //规则是:
        //每一行&列 都必须有 数1-9 且不重复repetition
        //每个3*3表格必须包含1-9 不重复 -->滑动窗口?
        //note:
        //部分填充的数独 可以是有效的但不一定是有解的
        //仅填充数的格子需要按照上面的规则--->没有要求完成这个数独,不用填数

        //所以这个题的中等难度体现在哪里???
        for (int i = 0; i < 9; i++) {
            vector<int> rowCount(9, 0);
            vector<int> colCount(9, 0);
            for (int j = 0; j < 9; j++) {
                // 检查行
                if (board[i][j] != '.') {
                    int index = board[i][j] - '0' - 1;
                    rowCount[index]++;
                    if (rowCount[index] > 1) return false;
                }
                // 检查列
                if (board[j][i] != '.') {
                    int index = board[j][i] - '0' - 1;
                    colCount[index]++;
                    if (colCount[index] > 1) return false;
                }
            }
        }

        // 检查3x3格子
        for (int row = 0; row < 9; row += 3) {
            for (int col = 0; col < 9; col += 3) {
                if (!SubCheck(row, col, board)) return false;
            }
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值