题目简介:
给你一个字符串形式的电话号码 number
。number
由数字、空格 ' '
、和破折号 '-'
组成。
请你按下述方式重新格式化电话号码。
- 首先,删除 所有的空格和破折号。
- 其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:
- 2 个数字:单个含 2 个数字的块。
- 3 个数字:单个含 3 个数字的块。
- 4 个数字:两个分别含 2 个数字的块。
最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。
返回格式化后的电话号码。
示例 1:
1 2 3 4 5 6
| 输入:number = "1-23-45 6" 输出:"123-456" 解释:数字是 "123456" 步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。 步骤 2:剩下 3 个数字,将它们放入单个含 3 个数字的块。第 2 个块是 "456" 。 连接这些块后得到 "123-456" 。
|
示例 2:
1 2 3 4 5 6
| 输入:number = "123 4-567" 输出:"123-45-67" 解释:数字是 "1234567". 步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。 步骤 2:剩下 4 个数字,所以将它们分成两个含 2 个数字的块。这 2 块分别是 "45" 和 "67" 。 连接这些块后得到 "123-45-67"
|
提示:
2 <= number.length <= 100
number
由数字和字符 '-'
及 ' '
组成。
number
中至少含 2 个数字。
思路:
首先找到字符串中的所有数字,若nums.size() <= 4
,则根据长度分别进行不同操作并直接返回。
否则,判断nums.size() % 3
后的结果,先将前面的数字3个3个分组,最后剩下的数字进行额外处理。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| class Solution { public: string reformatNumber(string number) {
string nums; int i = 0; int count = 0; string res;
for(auto& num : number){
if(isdigit(num)) nums += num; }
if(nums.size() <= 3) return nums; if(nums.size() == 4){
count = 0; i = 0; while(i < nums.size()){
if(count == 2){
res += '-'; count = 0; } else{
res += nums[i]; i++; count++; } }
return res; }
int rest = nums.size() % 3;
if(rest == 1) rest = 4;
while(i < nums.size() - rest){
if(count == 3){
res += '-'; count = 0; } else{
res += nums[i]; count++; i++; } }
if(rest == 4){
res += '-'; count = 0; while(i < nums.size()){
if(count == 2){
res += '-'; count = 0; } else{
res += nums[i]; i++; count++; } } }
else if(rest != 0){ res += '-'; while(i < nums.size()){
res += nums[i]; i++; } }
return res; } };
|