You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

含1-9位置数字的字符串拆分后高效排序方案咨询

高效排序含位置数字的字符串:桶排序是最优解

嘿,这个问题太适合用桶排序来解决了!既然每个单词里都明确包含1-9的数字,而且数字直接对应它在结果里的位置,那咱们完全可以利用这个特性,做到最少的循环次数最高的效率——时间复杂度直接拉到O(n),比常规的比较排序(比如快排的O(n log n))高效得多。

核心思路:利用数字范围小的特性,一次遍历搞定

因为数字范围固定是1-9,咱们可以提前创建一个"桶数组",每个索引位置对应数字的排序位置(比如索引1放数字1的单词,索引2放数字2的单词,以此类推)。具体步骤:

  • 第一步:把输入字符串按空格拆分成单词数组,这一步是基础操作,任何语言都有对应的字符串拆分方法。
  • 第二步:创建一个长度为10的空数组(索引0不用,因为数字从1开始),作为我们的"桶"。
  • 第三步:只需要一次遍历所有单词
    • 从每个单词里提取出那个数字(因为题目说数字是连续有效的,所以遍历单词的字符找数字,或者用正则匹配都可以);
    • 把当前单词放到桶数组中对应数字的索引位置。
  • 第四步:把桶数组从索引1到9的元素按顺序拼接成字符串,就是最终的排序结果。

举个实际例子

拿你给的例子 "is2 this1 test4 3a" 来说:

  1. 拆分后得到单词数组:["is2", "this1", "test4", "3a"]
  2. 创建桶数组:['', '', '', '', '', '', '', '', '', ''](长度10)
  3. 遍历每个单词:
    • "this1" 里的数字是1 → 放到桶的索引1位置,桶变成:['', "this1", '', '', '', '', '', '', '', '']
    • "is2" 里的数字是2 → 放到桶的索引2位置,桶变成:['', "this1", "is2", '', '', '', '', '', '', '']
    • "3a" 里的数字是3 → 放到桶的索引3位置,桶变成:['', "this1", "is2", "3a", '', '', '', '', '', '']
    • "test4" 里的数字是4 → 放到桶的索引4位置,桶变成:['', "this1", "is2", "3a", "test4", '', '', '', '', '']
  4. 拼接桶的1-9索引元素,得到结果:"this1 is2 3a test4"

代码示例(Python)

def sort_sentence(s):
    words = s.split()
    # 初始化桶,长度10对应数字1-9
    bucket = [''] * 10
    for word in words:
        # 遍历字符找数字(比正则更快,适合短单词)
        for char in word:
            if char.isdigit():
                pos = int(char)
                bucket[pos] = word
                break
    # 拼接结果,去掉末尾可能的空字符串
    return ' '.join(bucket[1:10]).strip()

# 测试你的例子
print(sort_sentence("is2 this1 test4 3a"))  # 输出: this1 is2 3a test4

为什么这是最高效的?

  • 循环次数最少:只需要遍历一次单词数组(n次循环,n是单词数量),没有嵌套循环,也不需要两两比较。你不可能比这个循环次数更少了——毕竟每个单词都得处理一遍对吧?
  • 时间复杂度O(n):分配单词到桶是O(n),拼接结果是O(n),整体线性时间,比任何基于比较的排序算法(比如快排、归并排序的O(n log n))都高效。

对比常规排序方法

如果用常规的"提取数字作为排序key"的方法,比如Python里:

def sort_sentence(s):
    words = s.split()
    # 按单词里的数字排序
    sorted_words = sorted(words, key=lambda x: int([c for c in x if c.isdigit()][0]))
    return ' '.join(sorted_words)

这种方法代码简洁,但底层是Timsort(Python的内置排序算法),属于比较排序,时间复杂度是O(n log n),循环次数比桶排序多,因为排序过程中需要多次比较和调整位置,效率不如桶排序。

所以结论很明确:桶排序是这个问题的最优解,循环次数最少,效率最高

内容的提问来源于stack exchange,提问作者aishacs72

火山引擎 最新活动