我正在尝试解决编码蝙蝠的数组问题
返回一个包含与给定数组完全相同的数字的数组,但重新排列,以便每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]
如果有人可以帮我弄清楚我需要调整什么来让它通过最后一次测试谢谢你
你可以使用一个标志,这样你的第二个循环就会在找到下一个元素时停止迭代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;
}
}
当您将lastF设置为i + 2时,将lastF设置为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;
}
}