如何按案例和数字顺序对字符串进行排序?

时间:2016-10-31 01:45:24

标签: string algorithm sorting

给定一组随机排列的小写字母,大写字母和数字。

如何对数组进行排序,使所有小写字母都在所有大写字母之前,在所有数字之前?字符类不需要在各自的部分中按顺序排列。

必须在O(n)时间和O(1)空间运行。显然不能在build函数中使用build。

我的即时反应是在字符串中循环3次,例如下面。

var newArr = [];

for x in oldArr
    if x is lowercase
        newArr.add(x)

for x in oldArr
    if x is uppercase
        newArr.add(x)

for x in oldArr
    if x is number
        newArr.add(x)

但这使用O(n)内存。

2 个答案:

答案 0 :(得分:1)

要使用O(1)内存,您应该进行交换。 要在O(n)时间内完成,你应该进行2次运行来分割字符数组。

1)使用数组a的索引i和j替换2项的交换函数:

swap (a, i, j):
    if i <> j:
        tmp = a[i]
        a[i] = a[j]
        a[j] = a[i]

2)首先运行数组并先输入小写字母:

j = 0
for i in range(0, len(oldArr)):
    if oldArr[i] is lowercase:
        swap(oldArr, i, j)
        j++

3)运行数组并将大写字母放在小写字母后面:

for i in range(j, len(oldArr)):
    if oldArr[i] is uppercase:
        swap(oldArr, i, j)
        j++

4)如果number是字符的唯一左选项,则无法执行任何操作

答案 1 :(得分:0)

基数排序和计数排序不以线性时间运行或使用恒定空间。 但是,我发现荷兰国旗问题是相似的,并找到了解决方案。以下是链接和我的代码。 http://www.geeksforgeeks.org/sort-an-array-of-0s-1s-and-2s/ https://en.wikipedia.org/wiki/Dutch_national_flag_problem

var sortLowerUpperNumber = function(arr) {

    var lower = 0;                  // Index for lower case letter
    var mid = 0;                    // Index for upper case letter
    var num = nums.length - 1;      // Index for number 

    while (mid <= num) {
        switch(arr[mid]) {
            case lowerCaseLetter:
                swap(arr[low], arr[mid])
                low++;
                mid++;
                break;
            case upperCaseLetter:
                mid++;
                break;
            case number:
                swap(arr[mid], arr[num])
                num--;
                break;
        }
    }
};
相关问题