使用函数按字母顺序对字符串进行排序

Sca*_*ola 19 javascript sorting

想象一下,你被赋予了一个字符串,你必须使用函数按字母顺序对该字符串进行排序.例:

sortAlphabets( 'drpoklj' ); //=> returns 'djklopr'
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?

Tus*_*har 33

你可以使用数组sort函数:

var sortAlphabets = function(text) {
    return text.split('').sort().join('');
};
Run Code Online (Sandbox Code Playgroud)

脚步

  1. 转换stringarray
  2. 分类 array
  3. 转换回arraystring

演示

  • 时间复杂度:排序是O(N logN),拆分和连接是O(N),所以时间复杂度是O(N logN)。空间复杂度为 O(N)。 (7认同)
  • 这个解决方案的空间和时间复杂度是多少? (6认同)

T.J*_*der 14

正如前面的答案所示,您将字符串转换为单字符字符串数组,对其进行排序,然后将其重新组合成一个字符串。但是,使用split并不是第一步的最佳实践方法,因为 JavaScript 字符串是一系列 UTF-16 代码单元,可以容忍无效的代理对,并将split("")代理对拆分为各自的代码单元,可能会将它们分开,因此打破了他们应该形成一对的代码(松散地:字符)。因此,如果您在字符串中包含表情符号(例如)或在非西方脚本中包含数十万个字符中的任何一个,则这些字符可能会损坏。

在 ES5 及更早版本中,正确拆分字符串需要您检测和处理代理对以确保它们保持在一起,这有点麻烦并且涉及检查charCodeAt特定范围的值。

从 ES2015+ 开始,这真的很简单:您只需使用字符串的迭代器,它被定义为提供字符串中的每个代码,无论是单个代码单元还是两个代码单元。要获取代码点数组,您可以通过扩展符号 ( [...str]) 或Array.from( Array.from(str))使用迭代器。

所以使用它,我们得到:

function sortAlphabets(str) {
    return [...str].sort((a, b) => a.localeCompare(b)).join("");
}
Run Code Online (Sandbox Code Playgroud)

现场示例:

function sortAlphabets(str) {
    return [...str].sort((a, b) => a.localeCompare(b)).join("");
}
Run Code Online (Sandbox Code Playgroud)

请注意如何使用split,某些字符已被损坏。


mar*_*ter 10

较新的浏览器支持String.prototype.localeCompare(),这使得排序utf8编码字符串非常简单.请注意,不同的语言可能具有不同的字符顺序.有关localCompare的MDN的更多信息.

function sortAlphabet(str) {
  return [...str].sort((a, b) => a.localeCompare(b));
}

console.log(sortAlphabet("drpoklj")); // Logs: "djklopr"
Run Code Online (Sandbox Code Playgroud)

如果您只需要支持ascii字符串,那么默认的排序实现就可以了.

function sortAlphabet(str) {
  return [...str].sort();
}
Run Code Online (Sandbox Code Playgroud)