给定一组随机排列的小写字母,大写字母和数字。
如何对数组进行排序,使所有小写字母都在所有大写字母之前,在所有数字之前?字符类不需要在各自的部分中按顺序排列。
必须在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)内存。
答案 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;
}
}
};