【问题标题】:Sort a string alphabetically using a function使用函数按字母顺序对字符串进行排序
【发布时间】:2015-09-03 22:23:09
【问题描述】:

假设给你一个字符串,你必须使用一个函数按字母顺序对该字符串进行排序。示例:

sortAlphabets( 'drpoklj' ); //=> returns 'djklopr'

最好的方法是什么?

【问题讨论】:

  • 我自己不会这样做。我会去 Stackoverflow 并请人为我做这件事。
  • 我自己试过了,但找不到我要找的东西。这个答案只是增加了我的经验。

标签: javascript sorting


【解决方案1】:

可以使用数组sort函数:

var sortAlphabets = function(text) {
    return text.split('').sort().join('');
};

步骤

  1. string 转换为array
  2. 排序array
  3. array 转换回string

Demo

【讨论】:

  • 这个解决方案的空间和时间复杂度是多少?
  • @kdizzle 这些方法中的每一个都是 O(N) 本身...
  • 时间复杂度:sort是O(N logN),split和join是O(N),所以时间复杂度是O(N logN)。空间复杂度为 O(N)。
【解决方案2】:

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

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

console.log(sortAlphabet("drpoklj")); // Logs: "djklopr"

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

function sortAlphabet(str) {
  return [...str].sort().join("");
}

【讨论】:

  • 注意返回值是一个数组,应该是一个字符串,所以需要加上.join("")
  • @yl2015 好收获!我已经相应地更新了答案
【解决方案3】:

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

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

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

所以使用它,我们得到:

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

现场示例:

// Using the iterator
function sortAlphabets(str) {
    return [...str].sort((a, b) => a.localeCompare(b)).join("");
}

// Using split("")
function sortAlphabetsUsingSplit(str) {
    return str.split("").sort((a, b) => a.localeCompare(b)).join("");
}

const str = "?देवनागरी?";
console.log("Original string    : " + str);
console.log("Using the iterator : " + sortAlphabets(str));
console.log("Using split('')    : " + sortAlphabetsUsingSplit(str));

注意如何使用split,一些字符已被破坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多