[ CodeWar ] - 008:分割字符串

573 阅读1分钟

系列文章

题目

img-01

需求:

  • 检测传入字符串,并且以 2 为单位长度分割字符串
  • 如果字符串为偶数则刚好分割完毕
  • 如果字符串长度为奇数则在末尾添加 _

解析

这道题的思路还是比较简单的:

  • 先考虑空字符串的情况,返回一个 []
  • 然后直接分割字符串,如果字符串长度为偶数则刚好满足情况
  • 否则我们只需要在末尾添加一个 _ 即可
function solution(str{
  const ret = []
  if (str.length === 0) {
    return []
  } else {
    for (let i = 0; i < str.length; i = i + 2) {
      ret.push(str.slice(i, i + 2))
    }
  }
  return ret.map((s) => (s.length !== 2 ? `${s}_` : s))
}

优化

显然,上面的解法有写过于繁琐,那么有没有别的更好的方案呢?

答案肯定是有的,从题目的输入与输出(str -> arr),我们应该能想到一个函数:match()

这里简单说一下思路:

  • 首先为每一个输入的字符串在末尾添加一个 _
  • 通过 match() 匹配连续的两个字符,那么就会有以下情况
    • 空字符串,什么匹配不到
    • 字符串长度为奇数,算上加上的 _ 则为偶数,刚好匹配完成
    • 字符串长度为偶数,算上加上的 _ 则为奇数,最后的 _ 则被忽略

那么代码就很容易书写了:

const solution = (str) => `${str}_`.match(/../g) || []