3461. 判断操作后字符串中的数字是否相等 I
题目描述
给你一个由数字组成的字符串 s
。重复执行以下操作,直到字符串恰好包含 两个 数字:
- 从第一个数字开始,对于
s
中的每一对连续数字,计算这两个数字的和 模 10。 - 用计算得到的新数字依次替换
s
的每一个字符,并保持原本的顺序。
如果 s
最后剩下的两个数字 相同 ,返回 true
。否则,返回 false
。
示例 1:
输入: s = "3902"
输出: true
解释:
- 一开始,
s = "3902"
- 第一次操作:
(s[0] + s[1]) % 10 = (3 + 9) % 10 = 2
(s[1] + s[2]) % 10 = (9 + 0) % 10 = 9
(s[2] + s[3]) % 10 = (0 + 2) % 10 = 2
s
变为"292"
- 第二次操作:
(s[0] + s[1]) % 10 = (2 + 9) % 10 = 1
(s[1] + s[2]) % 10 = (9 + 2) % 10 = 1
s
变为"11"
- 由于
"11"
中的数字相同,输出为true
。
示例 2:
输入: s = "34789"
输出: false
解释:
- 一开始,
s = "34789"
。 - 第一次操作后,
s = "7157"
。 - 第二次操作后,
s = "862"
。 - 第三次操作后,
s = "48"
。 - 由于
'4' != '8'
,输出为false
。
提示:
3 <= s.length <= 100
s
仅由数字组成。
解法
方法一:模拟
我们可以模拟题目描述的操作,直到字符串 $s$ 中只剩下两个数字为止,判断这两个数字是否相同。
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 $s$ 的长度。
Python3
class Solution:
def hasSameDigits(self, s: str) -> bool:
t = list(map(int, s))
n = len(t)
for k in range(n - 1, 1, -1):
for i in range(k):
t[i] = (t[i] + t[i + 1]) % 10
return t[0] == t[1]
Java
class Solution {
public boolean hasSameDigits(String s) {
char[] t = s.toCharArray();
int n = t.length;
for (int k = n - 1; k > 1; --k) {
for (int i = 0; i < k; ++i) {
t[i] = (char) ((t[i] - '0' + t[i + 1] - '0') % 10 + '0');
}
}
return t[0] == t[1];
}
}
C++
class Solution {
public:
bool hasSameDigits(string s) {
int n = s.size();
string t = s;
for (int k = n - 1; k > 1; --k) {
for (int i = 0; i < k; ++i) {
t[i] = (t[i] - '0' + t[i + 1] - '0') % 10 + '0';
}
}
return t[0] == t[1];
}
};
Go
func hasSameDigits(s string) bool {
t := []byte(s)
n := len(t)
for k := n - 1; k > 1; k-- {
for i := 0; i < k; i++ {
t[i] = (t[i]-'0'+t[i+1]-'0')%10 + '0'
}
}
return t[0] == t[1]
}
TypeScript
function hasSameDigits(s: string): boolean {
const t = s.split('').map(Number);
const n = t.length;
for (let k = n - 1; k > 1; --k) {
for (let i = 0; i < k; ++i) {
t[i] = (t[i] + t[i + 1]) % 10;
}
}
return t[0] === t[1];
}