美文网首页
LeetCode学习计划:LeetCode 75-Level-2

LeetCode学习计划:LeetCode 75-Level-2

作者: alex很累 | 来源:发表于2022-07-21 15:52 被阅读0次

    202. 快乐数

    问题描述

    编写一个算法来判断一个数 n 是不是快乐数。
    「快乐数」 定义为:
    对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
    然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1
    如果这个过程 结果为 1,那么这个数就是快乐数。
    如果 n快乐数 就返回 true ;不是,则返回 false 。

    示例

    输入:n = 19
    输出:true
    解释:
    12 + 92 = 82
    82 + 22 = 68
    62 + 82 = 100
    12 + 02 + 02 = 1
    

    解题思路

    题中暗示了“无限循环”,我们可以这么认定不快乐数:
    在不断重复计算过程的时候,出现了重复的结果,进入无限循环,此时,我们可以认定这不是快乐数。

    代码示例(JAVA)

    class Solution {
        public boolean isHappy(int n) {
            Set<Integer> set = new HashSet<>();
            while (set.add(n)) {
                if (n == 1) {
                    return true;
                }
                n = buildHappy(n);
            }
            return false;
        }
    
        public int buildHappy(int n) {
            int sum = 0;
            while (n > 0) {
                sum += (n % 10) * (n % 10);
                n = n / 10;
            }
            return sum;
        }
    }
    

    执行结果


    54. 螺旋矩阵

    问题描述

    给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

    示例

    解题思路

    模拟法,这时候应该播放一首杨宗纬的《洋葱》...如果你愿意一层一层一层的剥开我的心......

    代码示例(JAVA)

    class Solution {
        public List<Integer> spiralOrder(int[][] matrix) {
            int top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1;
            int total = matrix.length * matrix[0].length;
    
            List<Integer> list = new ArrayList<>();
            while (total > 0) {
                // 上面一行
                for (int i = left; i <= right && total > 0; i++, total--) {
                    list.add(matrix[top][i]);
                }
                top++;
                // 右边一行
                for (int i = top; i <= bottom && total > 0; i++, total--) {
                    list.add(matrix[i][right]);
                }
                right--;
                // 下面一行
                for (int i = right; i >= left && total > 0; i--, total--) {
                    list.add(matrix[bottom][i]);
                }
                bottom--;
                // 左边一行
                for (int i = bottom; i >= top && total > 0; i--, total--) {
                    list.add(matrix[i][left]);
                }
                left++;
            }
    
            return list;
        }
    }
    

    1706. 球会落何处

    问题描述

    用一个大小为 m x n 的二维网格 grid 表示一个箱子。你有 n 颗球。箱子的顶部和底部都是开着的。
    箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角,可以将球导向左侧或者右侧。
    将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示。
    将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示。
    在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。如果球恰好卡在两块挡板之间的 "V" 形图案,或者被一块挡导向到箱子的任意一侧边上,就会卡住。
    返回一个大小为 n 的数组 answer ,其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1

    示例

    解题思路

    模拟法,遍历数组看每一列放球的掉落情况,球的运动大概可分为这几种:
    A. 假如当前格子为1\,那么它必须存在右边格子并且右边的格子也为\,才能是的球掉到右下方的格子;
    B. 假如当前格子为-1/,那么它必须存在左边格子并且右边的格子也为/,才能是的球掉到左下方的格子。

    代码示例(JAVA)

    class Solution {
        public int[] findBall(int[][] grid) {
            int[] result = new int[grid[0].length];
            for (int i = 0; i < result.length; i++) {
                int x = 0, y = i;
                while (x <= grid.length - 1) {
                    if (grid[x][y] == 1) {
                        // 在最右边 或 右边是-1形成V形
                        if (y == result.length - 1 || grid[x][y + 1] == -1) {
                            break;
                        }
                        y++;
                    } else {
                        // cur == -1
                        if (y == 0 || grid[x][y - 1] == 1) {
                            break;
                        }
                        y--;
                    }
                    x++;
                }
                result[i] = x == grid.length ? y : -1;
            }
            return result;
        }
    }
    

    相关文章

      网友评论

          本文标题:LeetCode学习计划:LeetCode 75-Level-2

          本文链接:https://www.haomeiwen.com/subject/kaqdirtx.html