LeetCode刷题-字符串1694:重新格式化电话号码

题目

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

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

    首先,删除 所有的空格和破折号。
    其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:
        2 个数字:单个含 2 个数字的块。
        3 个数字:单个含 3 个数字的块。
        4 个数字:两个分别含 2 个数字的块。

最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。

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

示例1:

输入:number = "1-23-45 6"
输出:"123-456"
解释:数字是 "123456"
步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。
步骤 2:剩下 3 个数字,将它们放入单个含 3 个数字的块。第 2 个块是 "456" 。
连接这些块后得到 "123-456" 。

示例2:

输入:number = "123 4-567"
输出:"123-45-67"
解释:数字是 "1234567".
步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。
步骤 2:剩下 4 个数字,所以将它们分成两个含 2 个数字的块。这 2 块分别是 "45" 和 "67" 。
连接这些块后得到 "123-45-67" 。

示例3:

输入:number = "123 4-5678"
输出:"123-456-78"
解释:数字是 "12345678" 。
步骤 1:第 1 个块 "123" 。
步骤 2:第 2 个块 "456" 。
步骤 3:剩下 2 个数字,将它们放入单个含 2 个数字的块。第 3 个块是 "78" 。
连接这些块后得到 "123-456-78" 。

示例4:

输入:number = "12"
输出:"12"

示例5:

输入:number = "--17-5 229 35-39475 "
输出:"175-229-353-94-75"

提示

  • 2 <= number.length <= 100
  • number 由数字和字符 '-'' ' 组成。
  • number 中至少含 2 个数字。

解题思路

法1:(执行用时16ms,内存消耗12.9MB)

根据题意,首先想到:

(1)将原字符串s中非数字符号去掉

(2)用一个新的字符串s1来存放重新格式化后的字符串,循环遍历处理后的字符串s,如果字符串后面剩余的长度 len(number[i:]) 大于4,则s1+剩余字符串中前三个字符并添加一个‘-’;

         如果字符串后面剩余的长度等于4,则s1+剩余字符串中前两个字符并添加“-”,结束循环;

         其它情况下,s1直接加上剩余的字符即可,结束循环;

(3)输出s1

class Solution(object):
    def reformatNumber(self, number):
        """
        :type number: str
        :rtype: str
        """
        for i in number:
            if not i.isnumeric():
                number = number.replace(i,"")
        s1 = ""
        i = 0
        while i < len(number):
            if len(number[i:]) > 4:
                s1 += number[i:i+3] + '-'
                i += 3
            elif len(number[i:]) ==4:
                s1 += number[i:i+2] + '-' + number[i+2:]
                break
            else:
                s1 += number[i:]
                break
        return s1

法2:先遍历再调整(执行用时12ms,内存消耗12.9MB)双百!推荐!!

(1)依然是先对原字符串进行处理,去除杂质,得到s;

(2)将字符串三三一组分为n份

(3)利用循环遍历n次  range(1,n+1),每三个数字后添加一个‘-’,并接到用于存储格式化后字符串的 res 上。

(4)遍历结束后判断s剩余长度,如果等于2,则直接加在res后面;

         如果等于0,则说明刚好三三一组,则将最后面多加的“-”去掉;

         其它情况下(等于1),说明最后四个数字应该两两一组,故先将剩余的数字全部加到res后面,再取res[:-3] + '-' +倒数第三个字符+倒数第一个字符

例如:处理后的s=‘1234567’,三三分组,可分为 7//3=2 份,res=""。

           遍历完成后,res=‘123-456-’

           判断三三分组后剩余的长度,这里剩余1,故先将剩下的数字直接加到res后面,得到res=‘123-456-7’,接着截取到倒数第四位,即res[:-3],此时res=‘123-45’,在后面加上‘-’,再加上倒数第三位和倒数第一位,就得到了结果res = ‘123-45-67’

class Solution(object):
    def reformatNumber(self, number):
        """
        :type number: str
        :rtype: str
        """
        s = number.replace("-","").replace(" ","")
        n = len(s) // 3
        res = ''
        for i in range(1,n+1):
            res += s[(i-1)*3:(i-1)*3+3] + '-'
        if len(s)-n*3 == 2:
            res += s[n*3:]
        elif len(s)-n*3 == 0:
            res = res[:-1]
        else:
            res += s[n*3:]
            res = res[:-3] + '-' + res[-3] + res[-1]
        return res

法3:(执行用时24ms,内存消耗12.9MB)

(1)依然是先对原字符串进行处理

(2)当字符串长度大于4时,三三一组加入新数组中(循环)

(3)当剩下的字符串等于4时,两两一组加入数组中

(4)其它情况下,直接将剩余数字加入数组中

(5)最后join函数将数组中内容用“-”连接即可

class Solution(object):
    def reformatNumber(self, number):
        """
        :type number: str
        :rtype: str
        """
        number = number.replace('-','').replace(' ','')
        s = []
        while len(number) > 4:
            s.append(number[:3])
            number = number[3:]
        if len(number) == 4:
            s.append(number[:2])
            s.append(number[2:])
        else:
            s.append(number[:])
        return '-'.join(s)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值