如何在线性时间和常量空间中对ascii字符的字符数组进行排序

时间:2017-04-11 04:58:13

标签: java arrays algorithm sorting

这是一个面试问题我。

A string of ascii characters, in sorted order of their ascii values. You can overwrite the existing array 

Aim for linear time and constant additional space

Use the fact that ascii has only 256 unique characters

我可以通过将单元格的计数增加到单元格[i] +256来完成线性时间复杂度,然后执行a(cell [i] / 256)+1来获取计数。然后,也许,打印出字符串。但那仍然是O(n)空间,因为我无法将输出保存在与输入相同的数组中。

此外,给出的方法原型是,

public String sortCharacters(String str)
{

}

由于字符串在Java中是不可变的,这个问题不可能解决吗?

2 个答案:

答案 0 :(得分:0)

使用只有256个字符的事实。为256个字符创建哈希映射。由于数字256是已知的,因此它仍被视为恒定空间。只需执行线性时间遍历,您就会得到排序列表。

答案 1 :(得分:0)

"恒定的额外空间"意味着您使用相同数量的额外空间,无论输入字符串的大小如何。

以下是您的工作方式:

  1. 创建一个256个整数的空数组,初始化为全0。
  2. 对于字符串中的每个字符,将字符转换为整数并增加数组中的相应值。
  3. 在您为所有字符完成该操作后,请浏览数组并输出显示的字符。
  4. 在伪代码中,它看起来像这样:

    counts = array[256] of int, initialized to 0
    // count character occurrences
    for each char in string
        index = (int)char
        counts[index] = counts[index + 1]
    
    // build string
    outputString = ""
    for index = 0 to 255
        if (counts[index] > 0)
            c = (char)index
            outputString = outputString + repeat(c, counts[index])
    
    return outputString;