我尝试了这个问题 . 我没有得到正确的解决方案 . 请帮助 .
问题:返回一个包含与给定数组完全相同的数字的数组,但重新排列,以便所有偶数都在所有奇数之前 . 除此之外,数字可以是任何顺序 . 您可以修改并返回给定的数组,或者创建一个新数组 . evenOdd([1,0,1,0,0,1,1])→[0,0,0,1,1,1,1]
evenOdd([3,3,2])→[2,3,3]
evenOdd([2,2,2])→[2,2,2]
public int[] evenOdd(int[] nums) {
int l = nums.length;
if(l<2)
return nums;
int j=l-1;
for(int i=0;i<l;i++)
{
if(nums[i]%2==1)
{
while(j>i && nums[j]%2!=0) {
j--;
}
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
j--;
}
}
return nums;
}
5 回答
由于数组的顺序无关紧要,你只需要一个循环,你可以尝试下面的函数,
你真的非常接近 . 如果你只是包装你拥有的代码:
在一个if里面
你的代码确实有效 .
不确定这是否“作弊”,但你可以创建2个阵列,1个保持平均值,1个保持赔率 . 在循环中,您可以将每个值的所有数字复制到偶数或奇数数组,然后在循环之后,将数组连接/合并在一个新数组中并返回新数组 .
如果性能不是很重要,您可以使用流:
不幸的是,IntStream没有
sorted
方法需要Comparator
(只有parameterless method,这就是为什么你必须使用Stream.sorted(Comparator)来装箱和取消装箱的原因 .这是一个需要
O(N)
时间和O(1)
空间来完成任务的代码 . 我为Python
代码道歉 .Explanation :代码逻辑非常自我解释 . 我们有两个计数器,从左端开始
i
,从右端开始j
. 如果左计数器指向even
,那么我们只是增加它,因为它在正确的位置 . [记住你想把平均值向左移动 . 所以这甚至已经在数组的左侧 . 所以我们只是递增i
] . 请查看代码逻辑,找出基于偶数或奇数元素的当前指针采取的操作 .例如:
如果我们发现指向
odd
的i
和指向偶数的
j` ,那么我们交换并移动两个指针 . 我希望这是可以理解的上面的解决方案是就地的,需要O(1)空间和O(N)时间...希望这有助于!!