给你一个字符串形式的电话号码 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 个数字。
var reformatNumber = function(number) {
const n = number.length, a = number.split('')
let len = 0
for (let i = 0; i < n; i++) {
if (i !== len) swap(a, i, len)
if (a[len] !== ' ' && a[len] !== '-') len++;
}
let mod = len % 3, cnt = (len - 1) / 3 | 0
if (mod === 1) mod = 4
const r = new Array(len + cnt)
for (let i = 0, pos = 0; i < len; i++) {
r[pos++] = a[i]
if (i === len - 1) continue
if (i < len - mod) {
if ((i + 1) % 3 === 0) r[pos++] = '-'
} else if (mod === 4) {
if ((len - i - 1) % 2 === 0) r[pos++] = '-'
}
}
return r.join('')
};
const swap = (nums, a, b) => {
const t = nums[a]
nums[a] = nums[b]
nums[b] = t
}
var reformatNumber = function(number) {
const n = number.length, a = number.split('')
let slow = 0
for (let fast = 0; fast < n; fast++) {
if (slow !== fast) swap(a, slow, fast)
if (a[slow] !== ' ' && a[slow] !== '-') slow++;
}
const len = slow + (slow - 1) / 3 | 0, r = new Array(len)
r[0] = a[0]
for (let i = 1, pos = 1; i < slow; i++) {
if (i % 3 === 0) r[pos++] = '-'
r[pos++] = a[i]
}
if (r[len - 2] === '-') swap(r, len - 2, len - 3)
return r.join('')
};
const swap = (nums, a, b) => {
const t = nums[a]
nums[a] = nums[b]
nums[b] = t
}
function reformatNumber(number: string): string {
const n = number.length, a = number.split('')
let slow = 0
for (let fast = 0; fast < n; fast++) {
if (slow !== fast) swap(a, slow, fast)
if (a[slow] !== '-' && a[slow] !== ' ') slow++
}
const len = slow + (slow - 1) / 3 | 0, r = new Array(len)
r[0] = a[0]
for (let i = 1, pos = 1; i < slow; i++) {
if (i % 3 === 0) r[pos++] = '-'
r[pos++] = a[i]
}
if (r[len - 2] === '-') swap(r, len - 2, len - 3)
return r.join('')
};
const swap = (nums, a, b) => {
[nums[a], nums[b]] = [nums[b], nums[a]]
}
class Solution {
function reformatNumber($number) {
$n = strlen($number);
$a = str_split($number);
$slow = 0;
for ($fast = 0; $fast < $n; $fast++) {
if ($fast !== $slow) $this->swap($a, $fast, $slow);
if ($a[$slow] !== '-' && $a[$slow] !== ' ') $slow++;
}
$len = $slow + ($slow - 1) / 3 | 0;
$r = array_fill(0, $len, 0);
$r[0] = $a[0];
for ($i = 1, $pos = 1; $i < $slow; $i++) {
if ($i % 3 === 0) $r[$pos++] = '-';
$r[$pos++] = $a[$i];
}
if ($r[$len - 2] === '-') $this->swap($r, $len - 2, $len - 3);
return implode('', $r);
}
function swap(&$nums, $a, $b) {
list($nums[$a], $nums[$b]) = array($nums[$b], $nums[$a]);
}
}
func reformatNumber(number string) string {
n, slow, a := len(number), 0, []byte(number)
for fast := 0; fast < n; fast++ {
if slow != fast {
swap(a, slow, fast)
}
if a[slow] != '-' && a[slow] != ' ' {
slow++
}
}
len := slow + (slow - 1) / 3 | 0
r := make([]byte, len)
r[0] = a[0]
for i, pos := 1, 1; i < slow; i++ {
if i % 3 == 0 {
r[pos] = '-'
pos++
}
r[pos] = a[i]
pos++
}
if r[len - 2] == '-' {
swap(r, len - 2, len - 3)
}
return string(r)
}
func swap(nums []byte, a, b int) {
nums[a], nums[b] = nums[b], nums[a]
}
class Solution {
public String reformatNumber(String number) {
int n = number.length(), slow = 0;
char[] a = number.toCharArray();
for (int fast = 0; fast < n; fast++) {
if (slow != fast) swap(a, slow, fast);
if (a[slow] != '-' && a[slow] != ' ') slow++;
}
int len = slow + (slow - 1) / 3;
char[] r = new char[len];
r[0] = a[0];
for (int i = 1, pos = 1; i < slow; i++) {
if (i % 3 == 0) r[pos++] = '-';
r[pos++] = a[i];
}
if (r[len - 2] == '-') swap(r, len - 2, len - 3);
return String.valueOf(r);
}
public void swap(char[] nums, int a, int b) {
char t = nums[a];
nums[a] = nums[b];
nums[b] = t;
}
}
public class Solution {
public string ReformatNumber(string number) {
int n = number.Length, slow = 0;
char[] a = number.ToCharArray();
for (int fast = 0; fast < n; fast++) {
if (slow != fast) swap(a, slow, fast);
if (a[slow] != '-' && a[slow] != ' ') slow++;
}
int len = slow + (slow - 1) / 3;
char[] r = new char[len];
r[0] = a[0];
for (int i = 1, pos = 1; i < slow; i++) {
if (i % 3 == 0) r[pos++] = '-';
r[pos++] = a[i];
}
if (r[len - 2] == '-') swap(r, len - 2, len - 3);
return new string(r);
}
public void swap(char[] nums, int a, int b) {
char t = nums[a];
nums[a] = nums[b];
nums[b] = t;
}
}
void swap(char* a, char* b) {
char t = *a;
*a = *b;
*b = t;
}
char * reformatNumber(char * number){
int n = strlen(number), slow = 0;
for (int fast = 0; fast < n; fast++) {
if (slow != fast) swap(&number[slow], &number[fast]);
if (number[slow] != '-' && number[slow] != ' ') slow++;
}
int len = slow + (slow - 1) / 3;
char* r = malloc(sizeof(char) * (len + 1));
r[0] = number[0];
for (int i = 1, pos = 1; i < slow; i++) {
if (i % 3 == 0) r[pos++] = '-';
r[pos++] = number[i];
}
if (r[len - 2] == '-') swap(&r[len - 2], &r[len - 3]);
r[len] = '\0';
return r;
}
class Solution { // char[] 实现
public:
string reformatNumber(string number) {
int n = number.size(), slow = 0;
char* a = number.data();
for (int fast = 0; fast < n; fast++) {
if (fast != slow) swap(a[fast], a[slow]);
if (a[slow] != '-' && a[slow] != ' ') slow++;
}
int len = slow + (slow - 1) / 3, pos = 1;
char r[len + 1];
r[0] = a[0];
for (int i = 1; i < slow; i++) {
if (i % 3 == 0) r[pos++] = '-';
r[pos++] = a[i];
}
if (r[len - 2] == '-') swap(r[len - 2], r[len - 3]);
r[len] = '\0';
return r;
}
};
class Solution { // vector<char> 实现
public:
string reformatNumber(string number) {
int n = number.size(), slow = 0;
char* a = number.data();
for (int fast = 0; fast < n; fast++) {
if (fast != slow) swap(a[fast], a[slow]);
if (a[slow] != '-' && a[slow] != ' ') slow++;
}
int len = slow + (slow - 1) / 3, pos = 1;
vector<char> r(len);
r[0] = a[0];
for (int i = 1; i < slow; i++) {
if (i % 3 == 0) r[pos++] = '-';
r[pos++] = a[i];
}
if (r[len - 2] == '-') swap(r[len - 2], r[len - 3]);
return string(r.begin(), r.end());
}
};
class Solution:
def reformatNumber(self, number: str) -> str:
n, slow, a = len(number), 0, list(number)
for fast in range(0, n):
if fast != slow: self.swap(a, fast, slow)
if a[slow] != '-' and a[slow] != ' ': slow += 1
m = slow + int((slow - 1) / 3)
r, pos = [''] * m, 1
r[0] = a[0]
for i in range(1, slow):
if i % 3 == 0: r[pos], pos = '-', pos + 1
r[pos], pos = a[i], pos + 1
if r[m - 2] == '-': self.swap(r, m - 2, m - 3)
return ''.join(r)
def swap(self, nums: List[str], a: int, b: int):
nums[a], nums[b] = nums[b], nums[a]