一道字节算法题
- 链接:算法连接
- 来源:牛客网
- 把数组元素按照正负序重排列
- 给定一个数组,数组它按照下面的规则重排列后的数组: 1. 数组中的正负数相互间隔 2. 符号相同的数字相对顺序不变 3. 如果某种符号的数字多余,放到数组最后
- 例如:-1,3,2,4,5,-6,7,-9
- 重排列后:3,-1,2,-6,4,-9,5,7
- 空间复杂度要求O(1)
解决思路:
既然要求空间复杂度为为O(1)级别那只能用双指针进行排序了。
我们遍历数组,交替的地寻找下一个正数/负数,记该数位置为j,将它插入到数组的当前位置i,并把数组[i~j]的元素往后移即可。
public void sortPosAndNeg(int[] array){
//正负数索引位置
int pos = 0, neg = 0;
//用flag来标记当前要插入的是正数还是负数
boolean flag = true;
for (int i = 0; i < array.length; i++) {
if (flag){
//从数组当前位置开始查找下一个正数
pos = i;
while (pos < array.length && array[pos] < 0){
pos++;
}
//找不到下一个正数,说明排序完了
if (pos >= array.length) break;
//后移,先取出要插入的数
int res = array[pos];
for (int j = pos; j > i; j--) {
array[j] = array[j-1];
}
array[i] = res;
flag = false;
}else {
neg = i;
while (neg < array.length && array[neg] > 0){
neg++;
}
if (neg >= array.length) break;
//后移
int res = array[neg];
for (int j = neg; j > i; j--) {
array[j] = array[j-1];
}
array[i] = res;
flag = true;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。