# repeat

# Description

重复 N 次给定字符串

# Params

(string, n)

# Return

string

# Code

function repeat(string, n) {
  let result = ''
  if (!string || n < 1 || n > Number.MAX_SAFE_INTEGER) {
    return result
  }
  // Leverage the exponentiation by squaring algorithm for a faster repeat.
  // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
  do {
    if (n % 2) {
      result += string
    }
    n = Math.floor(n / 2)
    if (n) {
      string += string
    }
  } while (n)

  return result
}

# Analyze

  1. 一开始做了参数合规化的处理,如果 n < 1 或者 n > Number.MAX_SAFE_INTEGER ,或者没有传入 string ,都返回空字符串
  2. 以快速幂算法来进行字符串的拼接
    • 字符串拼接的本质,就是相当于求一个数的幂,只不过幂是乘法,这里换成加法拼接即可
  3. 所以根据快速幂算法,这里代码可以改成
function repeat1(string, n) {
  let result = ''
  if (!string || n < 1 || n > Number.MAX_SAFE_INTEGER) {
    return result
  }
  while (n) {
    (n & 1) && (result += string)
    n >>= 1
    n && (string += string)
  }

  return result
}

这里借鉴了

  1. 快速幂 (opens new window)
  2. 快速幂算法 (opens new window)

# Remark

  1. 平方求幂 Wikipedia (opens new window)

# Example

console.log(repeat('ab', 4)) // abababab