正则零宽断言和负向零宽断言:正则、栈和递归求解《1556.千位分隔符》

2022-04-14 20:32:39

什么是正则的捕获型分组和非捕获型分组,什么是引用和反向引用,什么是零宽断言和负向零宽断言,用正则、迭代(栈)和递归 3 种算法求解《1556. 千位分隔数》

正则表达式速查表

正则

JavaScript 正则方法

例题

1556. 千位分隔数

给你一个整数 n,请你每隔三位添加点(即 "." 符号)作为千位分隔符,并将结果以字符串格式返回。

答案

正则
var thousandSeparator = function(n) {
  return (n + '').replace(/(?!^)(?=(\d{3})+$)/g, '.')
};

golang 不支持零宽断言和负向零宽断言

栈 · 迭代
var thousandSeparator = function(n) {
  const stack = [], r = []
  let i = 0
  do {
    stack.push(n % 10)
    n /= 10
    n |= 0
    if (++i % 3 === 0 && n !== 0) stack.push('.')
  } while (n)
  while (stack.length) r.push(stack.pop())
  return r.join('')
};
import "strconv"
func thousandSeparator(n int) string {
  if n == 0 {
    return "0"
  }
  i, r := 0, "" 
  for n > 0 {
    r = strconv.Itoa(n % 10) + r
    n /= 10
    i++
    if i % 3 == 0 && n != 0 {
      r = "." + r
    }
  }
  return r
}
递归
var thousandSeparator = function(n) {
  return d(n + '')
};
const d = s => {
  const n = s.length
  if (n <= 3) return s
  return d(s.slice(0, -3)) + '.' + s.slice(-3)
}
import "strconv"
func thousandSeparator(n int) string {
  return d(strconv.Itoa(n))
}

func d(s string) string {
  n := len(s)
  if n <= 3 {
    return s
  }
  return d(s[:n - 3]) + "." + s[n - 3:]
}
字符串的 append 操作,矩阵中两点曼哈顿距离最短,求解《1138. 字母板上的路径》
字符串的 append 操作,矩阵中两点曼哈顿距离最短,求解《1138. 字母板上的路径》
顺序遍历,求解《1790. 仅执行一次字符串交换能否使两个字符串相等》
顺序遍历,求解《1790. 仅执行一次字符串交换能否使两个字符串相等》
递归,分治,栈,顺序遍历深度,4 解法求解《856. 括号的分数》
递归,分治,栈,顺序遍历深度,4 解法求解《856. 括号的分数》