我有一个练习,我必须按以下方式对数组进行排序:
- 除以 4 且没有余数的数字将是数组中的第一个(例如 4、8、12、16)。
- 将 4 除以 1 的数字将是数组 (1,5,9) 中的第二个。
- 将 4 除以 2 的数字将是数组中的第三个 (2,6,10)。
- 将 4 除以 3 的数字将在数组中的最后一个。
例如,以下数组:
int []a={1,7,3,2,4,1,8,14}
将会:
4 8 1 1 2 14 3 7
组内的顺序无关紧要。
我找到了一个适用于 O(n) 时间复杂度和 O(1) 空间复杂度的解决方案。
但是,它很丑,在阵列上移动了 3 次。我想要一个更优雅的解决方案。
这是我的代码:
int ptr=a.length-1; int temp=0, i=0;
while (i<ptr){
//move 3 remained to the end
if (a[i] % 4==3){
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
i=0;
while (i<ptr){
if (a[i]%4==2)
{
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
i=0;
while (i<ptr){
if (a[i]%4==1)
{
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
重要的是要知道:
- 我不希望时间复杂度比 O(n) 差,空间复杂度比 O(1) 差。