我正在尝试解决编码棒上的数组问题,分配是
返回一个包含与给定数组完全相同的数字的数组,但重新排列,以便每4个后面紧跟一个5.不要移动4,但每个其他数字都可以移动。该数组包含相同数量的4和5,并且每4个后面有一个不是4的数字。在此版本中,5可能出现在原始数组中的任何位置。
我的代码通过了除
之外的所有测试([4, 9, 4, 9, 5, 5, 4, 9, 5]) → [4, 5, 4, 5, 9, 9, 4, 5, 9]
这是我的代码
public int[] fix45(int[] nums) {
int val =0, lastF = 0, var;
for (int i =0; i < nums.length-1; i++)
if (nums[i] == 4){
var = i+1;
for (int j = 0; j < nums.length; j++)
if ((nums[j] == 5) && (j >= lastF && j != var)){
lastF =j;
val = nums[i+1];
nums[i+1] = nums[j];
nums[j] = val;
}
}
return nums;
}
我的代码返回
[4, 5, 4, 5, 9, 5, 4, 9, 9]
如果有人可以帮我弄清楚我需要调整什么来让它通过最后一次测试谢谢
答案 0 :(得分:0)
你可以使用一个标志,这样你的第二个循环就会在找到下一个元素时停止迭代5.而不是在第二个循环中从0迭代,你可以从i迭代,这样它就变得更有效了。
boolean isFound = false;
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == 4) {
var = i + 1;
for (int j = i; j < nums.length && !isFound ; j++) {
if ((nums[j] == 5) && (j >= lastF && j != var)) {
lastF = j;
val = nums[i + 1];
nums[i + 1] = nums[j];
nums[j] = val;
isFound = true;
}
}
isFound = false;
}
}
答案 1 :(得分:0)
当您将lastF设置为i + 2时,将其设置为j。你用j替换i + 1所以你应该在i + 1(i + 2)之后将lastF设置为1而不是j。此外,你必须在lastF启动j-forloop。
它应该是这样的:
int val =0, lastF = 0, var;
for (int i =0; i < nums.length; i++)
if (nums[i] == 4){
var = i+1;
for (int j = lastF; j < nums.length; j++)
if ((nums[j] == 5) && (j >= lastF && j != var)){
lastF =i+2;
val = nums[i+1];
nums[i+1] = nums[j];
nums[j] = val;
}
}
答案 2 :(得分:0)
只需使用两个标志和两个指针,就可以在while循环中完成!
public int[] fix45(int[] nums) {
int start = 0;
int end = nums.length-1;
boolean is4 = false;
boolean is5 = false;
while( start < nums.length ){
if(nums[start] == 4 && nums[start+1]!=5){
is4 = true;
}
if(nums[end] == 5 && (end == 0 || (end-1>=0 && nums[end-1]!=4))){
is5 = true;
}
if(is4 && is5){
int temp = nums[start+1];
nums[start+1] = nums[end];
nums[end] = temp;
is4 = false;
is5 = false;
end = nums.length-1;
}
if(is4){
end--;
continue;
}
start++;
}
return nums;
}