问题是如何用Java中的codingBat解决这个问题。
问题陈述:
返回一个数组,该数组包含与给定数组完全相同的数字,但要重新排列,以便所有偶数都排在所有奇数之前。除此之外,数字可以是任意顺序。您可以修改并返回给定数组,也可以创建新数组。
偶数({1,0,1,0,0,1,1})→ {0, 0, 0, 1, 1, 1, 1}
偶数奇数({3,3,2})→{2,3,3}
偶数奇数({2,2,2})→{2,2,2}
这个问题很简单,有2个循环,我试图用1来解决它,但它太长了,我相信,有没有其他有效的方法来解决上述问题,使用1循环?不要使用集合!
我的解决方案:
public int[] evenOdd(int[] nums) {
boolean oddFound=false;
int count=-1;
int oddGap=0;
for(int i=0;i<nums.length;i++)
{
if(!(oddFound)&(nums[i]%2==0))
continue;
if((!oddFound)&(nums[i]%2==1))
{
oddFound=true;
count=i;
continue;
}
if((oddFound)&(nums[i]%2==1))
{
oddGap++;
continue;
}
if((oddFound)&(nums[i]%2==0))
{
int temp=nums[count];
nums[count]=nums[i];
nums[i]=temp;
if(i>0)
i--;
if(oddGap>0)
{
oddGap--;
count+=1;
oddFound=true;
continue;
}
oddFound=false;
}
}
return nums;
}
好的!我终于跳过了这个问题,这个问题实际上是关闭的,但是asker的解决方案几乎是存在的,除了在我修复的2种情况下失败:
我对asker的代码进行了注释,这使得它在几个案例中失败,如问题所示。
我认为以下是最简单、最优化的解决方案:
public int[] evenOdd(int[] nums) {
int y=nums.length,x,a=0;
int temp=0;
for(x=0;x<y;x++)
{
if(nums[x]%2==0) {
if(a>(y-2))
return nums;
else{
//nums[a]=nums[a]+nums[x];
//nums[x]=nums[a]-nums[x];
//nums[a]=nums[a]-nums[x];
temp=nums[a];
nums[a]=nums[x];
nums[x]=temp;
a+=1;
}
}
return nums;
}
您不需要任何临时列表或数组,因为您可以在原地对元素重新排序。
这是一个简单的算法:
知道了?以下是一些代码:
public int[] evenOdd(int[] nums) {
// (1)
int left = 0;
int right = nums.length -1;
do {
// (2)
while (left < right && nums[left] % 2 == 0)
left += 1;
// (3)
while (right > left && nums[right] % 2 != 0)
right -= 1;
// (4)
if (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
} while (left < right); // (5)
return nums;
}
由于可以创建一个新数组,而且数字的顺序与此无关,因此我将使用以下方法:
public int[] evenOdd(int[] nums) {
int[] output = new int[nums.length];
int evenPos = 0;
int oddPos = nums.length-1;
for (int i : nums) {
if (i%2==0) {
output[evenPos++]=i;
} else {
output[oddPos--]=i;
}
}
return output;
}
更新:一个不太可读的版本,不需要额外的数组(按照@Seelenvirtuose的建议,只是没有额外的循环)
public int[] evenOdd(int[] nums) {
int evenPos = 0;
int oddPos = nums.length-1;
while (true) {
if (evenPos>=oddPos || evenPos>=nums.length || oddPos<0) {
break;
}
if (nums[evenPos]%2==0) {
evenPos++;
}
if (nums[oddPos]%2!=0) {
oddPos--;
}
if (evenPos<oddPos && nums[evenPos]%2 != 0 && nums[oddPos]%2 == 0) {
int tmp = nums[evenPos];
nums[evenPos] = nums[oddPos];
nums[oddPos] = tmp;
oddPos--;
evenPos++;
}
}
return nums;
}
问题是如何用Java中的codingBat解决这个问题。 问题陈述: 给定一个int的非空数组,返回一个新数组,其中包含原始数组中位于原始数组中最后4个之后的元素。原始数组将至少包含一个4。请注意,在Java中创建长度为0的数组是有效的。 post4({2,4,1,2})→ {1, 2} post4({4,1,4,2})→ {2} post4({4,4,1,2,3})→ {1, 2, 3} 以下是
我编写了如下代码,但它没有正确返回第一个重复出现的字母。 示例:在单词“statistics”中,重复出现的字母是s、t和i,但字母t的递归速度比字母s和i快,但我的程序返回s而不是t。 根据手头的任务,使用两个for循环返回t需要做什么?
问题内容: 如果我从json.net获得序列化的JSON,如下所示: 我想让淘汰赛在FooList上输出foreach,但是我不确定如何继续,因为$ ref东西可能会抛出东西。 我在想解决方案将以某种方式通过不使用以下方式强制将所有Foos呈现在FooList中: 但这似乎很浪费。 问题答案: 从服务器接收的json对象包含循环引用。在使用对象之前,您必须首先 从对象中删除所有属性,这意味着`$r
我目前正在做codingbat问题的乐趣,我刚刚做了这个问题。 “给定一个字符串,考虑由字符串的前N个字符组成的前缀字符串。该前缀字符串是否出现在字符串的其他地方?假设字符串不是空的,并且N在1..str.length()的范围内。前缀再次(”abxyabc“,1)→真前缀再次(”abxyabc“,2)→真前缀再次(”abxyabc“,3)→假”http://codingbat.com/prob/
问题内容: 我注意到在.each()循环中的jQuery中使用AJAX时遇到问题。执行脚本时,仅更新数据库中的第一条记录。 这是我的脚本: 以及save.php的内容: 我已经读过我可以选择使用同步而不是异步,但是我也读过,这不是一个好习惯。 那么,我实际上如何异步完成此工作并解决问题? 问题答案: jQuery的$ .ajax()返回jQuery XMLHttpRequest对象(“ jqXHR