双指针 + 定长列表,字符串转数组,数组转字符串,求解《1694. 重新格式化电话号码》

2022-10-01 03:26:41
双指针 + 定长列表,字符串转数组,数组转字符串,求解《1694. 重新格式化电话号码》

例题

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 个数字。

答案

双指针 · 定长列表

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]

栈、顺序遍历,为可变数组添加元素,2 解法求解《1441. 用栈操作构建数组》
栈、顺序遍历,为可变数组添加元素,2 解法求解《1441. 用栈操作构建数组》
顺序遍历,哈希集合,求解《817. 链表组件》
顺序遍历,哈希集合,求解《817. 链表组件》
顺序遍历,求解《1790. 仅执行一次字符串交换能否使两个字符串相等》
顺序遍历,求解《1790. 仅执行一次字符串交换能否使两个字符串相等》