【每日一题记录】1694. 重新格式化电话号码

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

大家好 我是丝瓜咸蛋汤。今天带来的是一道在LeetCode上的题目,题目难度为简单。就在此为大家分享一下解答思路。

题目阐述

给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。

请你按下述方式重新格式化电话号码。

首先,删除 所有的空格和破折号。 其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块: 2 个数字:单个含 2 个数字的块。 3 个数字:单个含 3 个数字的块。 4 个数字:两个分别含 2 个数字的块。 最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。

返回格式化后的电话号码。

思路阐述

我使用一个名为 lastdash 的标志来记录破折号外观的最后一个索引。 遍历字符串时,将数字压入 res 中,同时忽略非数字项。 而且,遍历完字符串之后,就到了处理字符串尾部的时候了。 这里有两种情况:

if(lastdash==res.length-1)

这意味着最后一个破折号就在字符串的末尾。 所以删除它。

if (lastdash ==res.length - 2)

这似乎很复杂,但很容易。 只需交换最后一个破折号的位置和它后面的项目。

解答方案

function reformatNumber(number: string): string {
    let res = ""
    let index = 0
    let lastdash = -1
    while (index < number.length) {
        if (number[index] != (" ") && number[index] != ("-")) {
            res = res + number[index];
            if (res.length - lastdash > 3 && index != number.length - 1) {
                res = res + "-"
                lastdash = res.length - 1
            }
        }
        index = index + 1
    }
    if(lastdash==res.length-1)
        res=res.substring(0,res.length-1)
    if (lastdash ==res.length - 2) {
        let tail = res.substring(lastdash-3, res.length).split("")
        tail[tail.length-2]=tail[tail.length-3]
        tail[tail.length-3]='-'
        res=res.slice(0,lastdash-3).concat(tail.join(""))
    }
    return res
};

image.png

今天是国庆小长假的第一天,最后祝各位读者节日快乐!

我是丝瓜咸蛋汤
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg