给你一个字符串 word
,该字符串由数字和小写英文字母组成。
请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34"
将会变成 " 123 34 8 34"
。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"
、"34"
、"8"
和 "34"
。
返回对 word
完成替换后形成的 不同 整数的数目。
只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。
示例 1:
输入:word = "a123bc34d8ef34" 输出:3 解释:不同的整数有 "123"、"34" 和 "8" 。注意,"34" 只计数一次。
示例 2:
输入:word = "leet1234code234" 输出:2
示例 3:
输入:word = "a1b01c001" 输出:1 解释:"1"、"01" 和 "001" 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。
双指针
// 双指针
function numDifferentIntegers(word: string): number {
const wordSet = new Set<string>();
// 左右指针
let l = 0,
r = 0,
n = word.length;
function isNumber(str: string) {
return str >= "0" && str <= "9";
}
while (true) {
//将左指针移动到数字位置
while (!isNumber(word[l]) && l < n) {
l++;
}
if (l >= n) break;
r = l;
//移动字符串右指针,直到不为数字
while (isNumber(word[r]) && r < n) {
r++;
}
//如果长度只有1 ,则保留0
while (word[l] === "0" && r - l > 1) {
l++;
}
wordSet.add(word.slice(l, r));
// 将左指针快速跳到右指针,不用再++了
l = r;
}
return wordSet.size;
}