您的位置:首页 > 其它

Interleaving Positive and Negative Numbers

2017-11-18 20:14 417 查看
Given an array with positive and negative integers. Re-range it to interleaving with positive and negative integers.


 Notice


You are not necessary to keep the original order of positive integers or negative integers.

Have you met this question in a real interview? 

Yes

Example

Given 
[-1, -2,
-3, 4, 5, 6]
, after re-range, it will be 
[-1, 5, -2,
4, -3, 6]
 or any other reasonable answer.
一个写的并不简洁的代码
java

public class Solution {
/*
* @param A: An integer array.
* @return: nothing
*/
public void rerange(int[] nums) {
// write your code here
if (nums == null || nums.length < 3) {
return;
}
Arrays.sort(nums);
int size = nums.length;
boolean flag = true;
int left = 0;
int right = 0;
if (size % 2 == 0) {
left = 0;
right = size - 1;
while (left <= right) {
if (flag && left <= right) {
left++;
right--;
flag = !flag;
} else if (!flag && left <= right){
reverse(nums, left, right);
left++;
right--;
flag = !flag;
}
}
}

else if (size % 2 == 1 && nums[nums.length / 2] < 0) {
left = 1;
right = size - 1;
while (left <= right) {
if (flag && left <= right) {
reverse(nums, left, right);
left++;
right--;
flag = !flag;
} else if (!flag && left <= right) {
left++;
right--;
flag = !flag;
}
}
}

else if (size % 2 == 1 && nums[nums.length / 2] > 0) {
left = 0;
right = size - 2;
while (left <= right) {
if (flag && left <= right) {
reverse(nums, left, right);
left++;
right--;
flag = !flag;
} else if (!flag && left <= right) {
left++;
right--;
flag = !flag;
}
}
}
}

private void reverse(int[] nums, int start, int end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
}
}


简化后的代码
java
public class Solution {
/*
* @param A: An integer array.
* @return: nothing
*/
public void rerange(int[] nums) {
// write your code here
if (nums == null || nums.length < 3) {
return;
}
int left = 0;
int right = 0;
boolean flag = true;
Arrays.sort(nums);
if (nums.length % 2 == 0) {
left = 0;
right = nums.length - 1;
flag = true;
} else if (nums.length % 2 == 1 && nums[nums.length / 2] < 0) {
left = 1;
right = nums.length - 1;
flag = false;
} else if (nums.length % 2 == 1 && nums[nums.length / 2] > 0) {
left = 0;
right = nums.length - 2;
flag = false;
} else {
return;
}
while (left <= right) {
if (left <= right && flag) {
left++;
right--;
flag = !flag;
} else if (left <= right && !flag) {
reverse(nums, left, right);
left++;
right--;
flag = !flag;
}
}
}

private void reverse(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}


python
class Solution:
"""
@param: A: An integer array.
@return: nothing
"""
def rerange(self, nums):
# write your code here
if nums is None or len(nums) < 3:
return
left, right, flag = 0, 0, True
nums.sort()
if len(nums) % 2 == 0:
left, right, flag = 0, len(nums) - 1, True
elif len(nums) % 2 == 1 and nums[len(nums) / 2] < 0:
left, right, flag = 1, len(nums) - 1, False
elif len(nums) % 2 == 1 and nums[len(nums) / 2] > 0:
left, right, flag = 0, len(nums) - 2, False
else:
return
while left <= right:
if left <= right and flag:
left += 1
right -= 1
flag = not flag
elif left <= right and not flag:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
flag = not flag
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: