LeetCode 每日 1 题:字符串中不同整数的数目

95 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 8 天,点击查看活动详情

字符串中不同整数的数目

原题地址

给你一个字符串 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" 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。

提示:

  • 1 <= word.length <= 1000
  • word 由数字和小写英文字母组成

思路分析

  1. 首先可以根据正则匹配将非数字替换成空格,正则为 /[a-zA-z]/g
  2. 替换后的字符串按照空格进行分割成数组,a123bc34d8ef34 为例,分割后的数组为 [ '', '123', '', '34', '8', '', '34' ]
  3. 题目要求统计整数,那么需要把 空字符串 过滤掉,使用数组的 filter 方法过滤;
  4. 题目要求前导零需要去掉,那么定义一个方法 deletFirstZero 来删除前导零,方法中若字符串的第一个字符不为0就返回该字符串,否则继续递归除第一位外的剩余字符串,直到第一位不为0为止;
  5. 经过上述操作后,将数组去重返回长度即可。去重使用的 new Set(word)

AC 代码

/**
 * @param {string} word
 * @return {number}
 */
var numDifferentIntegers = function(word) {
    word = word.replace(/[a-zA-z]/g, ' ').split(' ')
    word = word.filter(item => item !== '')
    word = word.map(item =>  item = deletFirstZero(item))
    return Array.from(new Set(word)).length
};

deletFirstZero = function(num) {
    if(num[0] !== '0') return num
    num = num.substring(1)
    return deletFirstZero(num)
}

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了26.92%的用户
  • 内存消耗:42.9 MB, 在所有 JavaScript 提交中击败了15.38%的用户
  • 通过测试用例:85 / 85

END