我正在尝试对整数数组进行排序,使得所有偶数都在奇数之前,而不使用任何外部库。 您可以通过以下方式识别:http://codingbat.com/prob/p105771
" 返回一个包含与给定数组完全相同的数字的数组,但重新排列,以便所有偶数都在所有奇数之前。除此之外,数字可以是任何顺序。您可以修改并返回给定的数组,或者创建一个新数组。" 我有完成此目标的代码:
public int[] evenOdd(int[] nums) {
int c=0;
int c2=0;
int [] nums2=new int[nums.length];
for(int i=0;i<nums.length;i++)
{
if(nums[i]%2==0)
{
nums2[c]=nums[i];
c++;
}
else
{
nums2[nums.length-c2-1]=nums[i];
c2++;
}
}
return nums2;
}
我也通过调用array.sort()
然后按索引插入数字,递增2,然后插入余数来解决问题。这也有效。
所以,为了做一个简短的帖子 - 将来有更优雅的方式来实现这个目标吗? 谢谢!
答案 0 :(得分:2)
只是我的评论的后续行动。以下是如何在没有额外空格的O(n)
中执行此操作:
public class Main {
public static void main(String[] args) {
evenOdd(new int[]{1, 2, 3, 4, 5, 6, 7});
evenOdd(new int[]{2, 3, 4, 5, 6, 7});
evenOdd(new int[]{1, 1, 1, 1, 1});
evenOdd(new int[]{2, 2, 2, 2});
}
public static void evenOdd(int[] a) {
int firstOdd = 0;
for (int i = 0; i < a.length; ++i) {
if (a[i] % 2 == 0) {
int t = a[firstOdd];
a[firstOdd] = a[i];
a[i] = t;
firstOdd++;
// } else {
// else is redundant, just leave odd in-place
}
}
System.out.println(Arrays.toString(a));
}
}
答案 1 :(得分:1)
创建一个包含int的包装器对象,称之为SortingWrapper。此对象应实现Comparable,以使其自然排序顺序基于值%2的排序顺序。然后使用Arrays.sort()对数组进行排序。基于compareTo()实现,evens将自然地(即,根据它们的自然排序顺序)冒泡一种方式,所有的可能性将使另一方冒泡。
或者,你可以只使用Integers作为你的包装器并传递一个与Arrays.sort()做同样事情的Comparator。
编辑 - 这是一般的想法。你可能不得不玩排序顺序,但我认为这非常有效。我怀疑这个数组将算作&#34;大多数排序&#34;根据Arrays.sort()的javadoc,这将使性能更倾向于O(n)而不是log(n)。
public void sortOddsAndEvents(Integer[] input)
{
Arrays.sort(input, new Comparator<Integer>()
{
@Override
public int compare(Integer arg0, Integer arg1)
{
if (arg0.equals(arg1)) return 0;
else return Integer.compare(arg0.intValue()%2, arg1.intValue()%2);
}
});
}
答案 2 :(得分:0)
public int[] evenOdd(int[] nums) {
int evenCounter = -1, oddCounter = nums.length;
int[] ordered = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
int current = (nums[i] % 2 == 0) ? ++evenCounter : --oddCounter;
ordered[current] = nums[i];
}
return ordered;
}