1

处理这个代码战挑战

重新排序字符串的字符,以便它们以“不区分大小写的字母顺序”顺序连接成一个新字符串。空格和标点符号将被简单地删除!

输入被限制为不包含数字,并且只包含包含英文字母的单词。

例子:

按字母顺序排列(“圣经”)//“BbeehHilloTy”

我开始:

function alphabetized(s) {
    s = s.replace(/\s/g, "").toLowerCase();
    return s.split("").sort().join("");
}

console.log(alphabetized("The Holy Bible"));

但是我们当然要 return BbeehHilloTy,保持原始字符的大小写。

坦率地说,我不明白为什么期望的结果应该是BbeehHilloTy.

如果我们不根据 ASCII 字符代码值进行排序,那么是什么决定了新字符串中大写字母是否应该出现在小写字母前面?

4

2 回答 2

1

这是一种通过比较字符串中字符的索引是否相等来创建稳定排序的方法:

function alphabetized(s){
  s = s.replace(/\s+|\W+|\d+|[_]+/g, "");
  return s.split('')
    .map(function(x, i){ return [x, i]; })
    .sort(function([a, i], [b, j]){
      a = a.toLowerCase();
      b = b.toLowerCase();
      if (a == b)
        return i - j;
      else if (a < b)
        return -1;
      else
        return 1;
      })
      .map(function([x, i]){ return x; })
      .join('');
}

console.log(alphabetized("The Holy Bible"));

于 2019-06-07T18:11:51.047 回答
0

根据@user3483203 的代码:

function alphabetized(s) {
    s = s.replace(/\s+|\W+|\d+|[_]+/g, "");
    return s.split("").sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())).join("");
}

console.log(alphabetized("The Holy Bible"));

所以关键是在这里使用localCompare()

编辑:实际上这个解决方案不适用于 Codewars 上的所有测试。

于 2019-06-07T18:00:03.963 回答