边界上有一只蚂蚁,它有时向 左 走,有时向 右 走。
给你一个 非零 整数数组 nums
。蚂蚁会按顺序读取 nums
中的元素,从第一个元素开始直到结束。每一步,蚂蚁会根据当前元素的值移动:
- 如果
nums[i] < 0
,向 左 移动-nums[i]
单位。 - 如果
nums[i] > 0
,向 右 移动nums[i]
单位。
返回蚂蚁 返回 到边界上的次数。
注意:
- 边界两侧有无限的空间。
- 只有在蚂蚁移动了
|nums[i]|
单位后才检查它是否位于边界上。换句话说,如果蚂蚁只是在移动过程中穿过了边界,则不会计算在内。
示例 1:
输入:nums = [2,3,-5] 输出:1 解释:第 1 步后,蚂蚁距边界右侧 2 单位远。 第 2 步后,蚂蚁距边界右侧 5 单位远。 第 3 步后,蚂蚁位于边界上。 所以答案是 1 。
示例 2:
输入:nums = [3,2,-3,-4] 输出:0 解释:第 1 步后,蚂蚁距边界右侧 3 单位远。 第 2 步后,蚂蚁距边界右侧 5 单位远。 第 3 步后,蚂蚁距边界右侧 2 单位远。 第 4 步后,蚂蚁距边界左侧 2 单位远。 蚂蚁从未返回到边界上,所以答案是 0 。
没啥可说的
class Solution {
public int returnToBoundaryCount(int[] nums) {
int ans = 0;
int left = 0;
for (int i = 0; i < nums.length; i++) {
left += nums[i];
if (left == 0)
ans += 1;
}
return ans;
}
}
给你一个下标从 0 开始的字符串 word
和一个整数 k
。
在每一秒,你必须执行以下操作:
- 移除
word
的前k
个字符。 - 在
word
的末尾添加k
个任意字符。
注意 添加的字符不必和移除的字符相同。但是,必须在每一秒钟都执行 两种 操作。
返回将 word
恢复到其 初始 状态所需的 最短 时间(该时间必须大于零)。
示例 1:
输入:word = "abacaba", k = 3 输出:2 解释: 第 1 秒,移除 word 的前缀 "aba",并在末尾添加 "bac" 。因此,word 变为 "cababac"。 第 2 秒,移除 word 的前缀 "cab",并在末尾添加 "aba" 。因此,word 变为 "abacaba" 并恢复到始状态。 可以证明,2 秒是 word 恢复到其初始状态所需的最短时间。
示例 2:
输入:word = "abacaba", k = 4 输出:1 解释: 第 1 秒,移除 word 的前缀 "abac",并在末尾添加 "caba" 。因此,word 变为 "abacaba" 并恢复到初始状态。 可以证明,1 秒是 word 恢复到其初始状态所需的最短时间。
我们只需要考虑,每次切掉前k个之后,剩下的字符串,是不是原word的开头 每次判断是否和第一个相等
class Solution {
public int minimumTimeToInitialState(String word, int k) {
int n = word.length();
int ans = 0;
int sum = (int) Math.ceil((double) n / k);
for (int i = k; i < n; i = i + k) {
ans++;
if (word.indexOf(word.substring(i)) == 0)
return ans;
}
return sum;
}
}
给你一个下标从 0 开始、大小为 m x n
的网格 image
,表示一个灰度图像,其中 image[i][j]
表示在范围 [0..255]
内的某个像素强度。另给你一个 非负 整数 threshold
。
如果 image[a][b]
和 image[c][d]
满足 |a - c| + |b - d| == 1
,则称这两个像素是 相邻像素 。
区域 是一个 3 x 3
的子网格,且满足区域中任意两个 相邻 像素之间,像素强度的 绝对差 小于或等于 threshold
。
区域 内的所有像素都认为属于该区域,而一个像素 可以 属于 多个 区域。
你需要计算一个下标从 0 开始、大小为 m x n
的网格 result
,其中 result[i][j]
是 image[i][j]
所属区域的 平均 强度,向下取整 到最接近的整数。如果 image[i][j]
属于多个区域,result[i][j]
是这些区域的 “取整后的平均强度” 的 平均值,也 向下取整 到最接近的整数。如果 image[i][j]
不属于任何区域,则 result[i][j]
等于 image[i][j]
。
返回网格 result
。
示例 1:
输入:image = [[5,6,7,10],[8,9,10,10],[11,12,13,10]], threshold = 3 输出:[[9,9,9,9],[9,9,9,9],[9,9,9,9]] 解释:图像中存在两个区域,如图片中的阴影区域所示。第一个区域的平均强度为 9 ,而第二个区域的平均强度为 9.67 ,向下取整为 9 。两个区域的平均强度为 (9 + 9) / 2 = 9 。由于所有像素都属于区域 1 、区域 2 或两者,因此 result 中每个像素的强度都为 9 。 注意,在计算多个区域的平均值时使用了向下取整的值,因此使用区域 2 的平均强度 9 来进行计算,而不是 9.67 。
cnt数组记录每个元素在3×3矩阵出现了几次
如果cnt为0,那么result还是原值,否则为累加后的result/cnt
public class Solution {
public int[][] resultGrid(int[][] a, int threshold) {
int m = a.length;
int n = a[0].length;
int[][] result = new int[m][n];
int[][] cnt = new int[m][n];
for (int i = 2; i < m; i++) {
next:
for (int j = 2; j < n; j++) {
// 检查左右相邻格子
for (int x = i - 2; x <= i; x++) {
if (Math.abs(a[x][j - 2] - a[x][j - 1]) > threshold || Math.abs(a[x][j - 1] - a[x][j]) > threshold) {
continue next; // 不合法,下一个
}
}
// 检查上下相邻格子
for (int y = j - 2; y <= j; ++y) {
if (Math.abs(a[i - 2][y] - a[i - 1][y]) > threshold || Math.abs(a[i - 1][y] - a[i][y]) > threshold) {
continue next; // 不合法,下一个
}
}
// 合法,计算 3x3 子网格的平均值
int avg = 0;
for (int x = i - 2; x <= i; x++) {
for (int y = j - 2; y <= j; y++) {
avg += a[x][y];
}
}
avg /= 9;
// 更新 3x3 子网格内的 result
for (int x = i - 2; x <= i; x++) {
for (int y = j - 2; y <= j; y++) {
result[x][y] += avg; // 先累加,最后再求平均值
cnt[x][y]++;
}
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (cnt[i][j] == 0) { // (i,j) 不属于任何子网格
result[i][j] = a[i][j];
} else {
result[i][j] /= cnt[i][j]; // 求平均值
}
}
}
return result;
}
}
class Solution {
public int minimumTimeToInitialState(String S, int k) {
char[] s = S.toCharArray();
int n = s.length;
int[] z = new int[n];
int l = 0, r = 0;
for (int i = 1; i < n; i++) {
if (i <= r) {
z[i] = Math.min(z[i - l], r - i + 1);
}
while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
l = i;
r = i + z[i];
z[i]++;
}
if (i % k == 0 && z[i] >= n - i) {
return i / k;
}
}
return (n - 1) / k + 1;
}
}