🤖 AI总结
主题
使用Go语言解决检查相邻数字差是否不超过2的算法问题。
摘要
文章讲解如何用Go语言检查字符串中相邻数字差值是否均不超过2,提供多语言实现及复杂度分析。
关键信息
- 1 给定数字字符串,检查所有相邻数字的绝对差值是否都不超过2。
- 2 提供了Go、Python、C++三种语言的完整实现。
- 3 时间复杂度O(n),额外空间复杂度O(1)。
2026-08-24:检查相邻数字差。用go语言,给定一个纯数字字符串,你需要检查其中任意两个紧挨着的数字,它们数值上的差距是否都不会超过 2。
如果整串数字中所有相邻位置都满足这个条件,就返回“是”(true);只要有一处相邻数字的差值大于 2,就返回“否”(false)。
这里的差值指的是两个数字相减后取绝对值。
2 <= s.length <= 100。
s 仅由数字组成。
输入: s = “132”。
输出: true。
解释:
s[0] 和 s[1] 处数字的绝对差为 abs(1 – 3) = 2。
s[1] 和 s[2] 处数字的绝对差为 abs(3 – 2) = 1。
由于两个差值都至多为 2,因此答案为 true。
题目来自力扣3931。
详细步骤分解
第一步:获取输入字符串
程序接收一个字符串s,例如”132″。这个字符串只包含数字字符’0’到’9’,长度在2到100之间。
第二步:准备遍历
我们要检查的是相邻位置,所以需要从字符串的第一个字符开始,一直检查到倒数第二个字符。对于长度为n的字符串,需要检查的位置对是(0,1)、(1,2)、…、(n-2,n-1),总共n-1对。
第三步:逐个检查相邻数字对
在每次循环中:
• 取出当前位置的字符s[i]和下一个位置的字符s[i+1]
• 将这两个字符转换成它们对应的整数值。字符’0’对应整数0,’1’对应整数1,依此类推。在Go语言中,对字符做int()转换会得到该字符的ASCII码,比如’0’是48,’1’是49,所以两个字符的ASCII码差值就等于它们所代表数字的差值,因此可以直接用ASCII码相减。
• 计算这两个整数的绝对差值。如果差值为负数,就取它的相反数;如果为正或零,就保持原值。
• 将这个绝对差值与2进行比较:如果大于2,说明这一对相邻数字不符合要求,立即返回false,整个函数结束。
第四步:完成全部检查
如果循环完整执行完毕,没有遇到任何差值大于2的情况,说明所有相邻数字对都满足条件,此时返回true。
第五步:输出结果
在主函数中,将返回的布尔值打印出来,在Go中布尔值的默认输出就是true或false。
针对示例”132″的执行过程
• 第一次循环检查位置0和1:字符’1’和’3’,ASCII码分别是49和51,差值绝对值为2,不大于2,继续。
• 第二次循环检查位置1和2:字符’3’和’2’,ASCII码分别是51和50,差值绝对值为1,不大于2,继续。
• 循环结束,所有相邻对都检查通过,返回true并打印输出。
时间复杂度和空间复杂度
时间复杂度:O(n),其中n是字符串的长度。程序只需要遍历一次字符串,对每个相邻位置做常数时间的计算和比较操作。最坏情况下,如果所有相邻差值都满足条件,会检查n-1对;如果中途发现不符合,则提前终止,但总体仍不超过n-1次操作。因此时间复杂度与字符串长度呈线性关系。
额外空间复杂度:O(1),即常数级别。程序在检查过程中只使用了几个临时变量来存储字符值、差值等,没有使用随输入规模增长的额外数据结构(如数组、切片、映射等)。无论字符串多长,占用的额外内存空间都是固定的少量字节。
Go完整代码如下:
package main
import (
"fmt"
)
func isAdjacentDiffAtMostTwo(s string) bool {
for i := range len(s) - 1 {
if abs(int(s[i])-int(s[i+1])) > 2 {
return false
}
}
return true
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}func main() {
s := "132"
result := isAdjacentDiffAtMostTwo(s)
fmt.Println(result)
}
![]()
Python完整代码如下:
# -*-coding:utf-8-*-
def abs_value(x: int) -> int:
return -x if x < 0 else x
def is_adjacent_diff_at_most_two(s: str) -> bool:
for i in range(len(s) - 1):
if abs_value(ord(s[i]) - ord(s[i+1])) > 2:
return False
return True# 测试
s = "132"
result = is_adjacent_diff_at_most_two(s)
print(result)
![]()
C++完整代码如下:
using namespace std;
bool isAdjacentDiffAtMostTwo(const string& s) {
for (size_t i = 0; i < s.length() - 1; i++) {
if (abs(s[i] - s[i+1]) > 2) {
return false;
}
}
return true;
}int main() {
string s = "132";
cout << boolalpha << isAdjacentDiffAtMostTwo(s) << endl;
return 0;
}
![]()
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。