美文网首页
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