题目:
给定一个数组 nums ,其中包含正数与负数,并且已经按照从小到大排列,请按照绝对值从小到大重新排列
例如:
nums = {-9,-8,-7,-6,1,2,3,4};
排序后
nums = {1,2,3,4,-6,-7,-8,-9} ;
思路:
找到正负交界处,设最小的正数下标为 i ,最大的负数下标为 j , 依次进行判断,绝对值小的数放入 list 中
注: 这个是允许使用新空间的
Java代码如下:
public class Main{
@Test
public void test40(){
int[] nums = {-9,-8,-7,-6,1,2,3,4};
sort(nums);
}
public void sort(int[] nums){
List<Integer> result = new ArrayList<>();
int zeroIndex = -1;
for(int i=0;i<nums.length-1;i++){
if(nums[i] < 0 && nums[i+1]>=0){
zeroIndex = i; //正负分界
}
}
int i = zeroIndex + 1; // 最小的正数下标
int j = zeroIndex; // 最大的负数下标
while (i<nums.length && j>=0){
if(nums[i] < Math.abs(nums[j])){
result.add(nums[i]);
i++;
}else {
result.add(nums[j]);
j--;
}
}
while (i<nums.length){
result.add(nums[i++]);
}
while (j>=0){
result.add(nums[j--]);
}
for(int a:result){
System.out.print(a+",");
}
}
}