跳转至

3931. 检查相邻数字差

题目描述

给你一个由数字组成的字符串 s

如果每一对 相邻 数字之间的 绝对差 都至多为 2,则返回 true;否则返回 false

ab 之间的绝对差定义为 abs(a - b)

 

示例 1:

输入: s = "132"

输出: true

解释:

  • s[0]s[1] 处数字的绝对差为 abs(1 - 3) = 2
  • s[1]s[2] 处数字的绝对差为 abs(3 - 2) = 1
  • 由于两个差值都至多为 2,因此答案为 true

示例 2:

输入: s = "129"

输出: false

解释:

  • s[0]s[1] 处数字的绝对差为 abs(1 - 2) = 1
  • s[1]s[2] 处数字的绝对差为 abs(2 - 9) = 7,大于 2。
  • 因此,答案为 false

 

提示:

  • 2 <= s.length <= 100
  • s 仅由数字组成。

解法

方法一:模拟

我们可以模拟题目中描述的过程,遍历字符串中的每一对相邻数字,计算它们之间的绝对差,如果发现有一对数字的绝对差大于 2,则返回 \(\text{false}\);如果遍历完成后没有发现任何一对数字的绝对差大于 2,则返回 \(\text{true}\)

时间复杂度 \(O(n)\),其中 \(n\) 是字符串的长度。空间复杂度 \(O(1)\)

1
2
3
class Solution:
    def isAdjacentDiffAtMostTwo(self, s: str) -> bool:
        return all(abs(x - y) <= 2 for x, y in pairwise(map(int, list(s))))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution {
    public boolean isAdjacentDiffAtMostTwo(String s) {
        for (int i = 1; i < s.length(); ++i) {
            if (Math.abs(s.charAt(i - 1) - s.charAt(i)) > 2) {
                return false;
            }
        }
        return true;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Solution {
public:
    bool isAdjacentDiffAtMostTwo(string s) {
        for (int i = 1; i < s.size(); ++i) {
            if (abs(s[i - 1] - s[i]) > 2) {
                return false;
            }
        }
        return true;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func isAdjacentDiffAtMostTwo(s string) bool {
    for i := 1; i < len(s); i++ {
        if abs(int(s[i-1])-int(s[i])) > 2 {
            return false
        }
    }
    return true
}

func abs(x int) int {
    if x < 0 {
        return -x
    }
    return x
}
1
2
3
4
5
6
7
8
function isAdjacentDiffAtMostTwo(s: string): boolean {
    for (let i = 1; i < s.length; i++) {
        if (Math.abs(Number(s[i]) - Number(s[i - 1])) > 2) {
            return false;
        }
    }
    return true;
}

评论