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. 螺旋矩阵
问题描述
给你一个 m
行 n
列的矩阵 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;
}
}
网友评论