题目
给你一个字符串形式的电话号码 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)