Snažím sa vyriešiť problém s poľom kódovania úloh
Vráťte pole, ktoré obsahuje presne to istéčísla ako dané pole, ale preusporiadané tak, aby každý 4 bezprostredne nasledoval 5. Nehýbte 4 ", ale každé iné číslo sa môže pohybovať. Pole obsahuje rovnaké číslo 4" s a 5 "s, a každé 4 má po ňom číslo, ktoré nie je 4. V tejto verzii sa 5 "môže objaviť kdekoľvek v pôvodnom poli.
môj kód prechádza všetky testy s výnimkou nižšie uvedeného
([4, 9, 4, 9, 5, 5, 4, 9, 5]) → [4, 5, 4, 5, 9, 9, 4, 5, 9]
tu je môj kód
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;
}
môj kód sa vracia
[4, 5, 4, 5, 9, 5, 4, 9, 9]
ak mi niekto môže pomôcť zistiť, čo potrebujem na vylepšenie, aby to prešlo posledným testom, ďakujem
odpovede:
0 pre odpoveď č. 1Môžete použiť príznak, aby sa vaša druhá slučka zastavilaiterating, keď nájde ďalší element 5. Taktiež namiesto Iterating od 0 na druhej slučke by ste mohli opakovať od i namiesto toho sa stáva efektívnejším.
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;
}
}
0 pre odpoveď č. 2
Nastavíte lastF na j, keď ho nastavíte na i + 2. Nahradiť i + 1 s j, takže by ste mali nastaviť lastF na jednu po i + 1 (i + 2) namiesto j. Tiež musíte spustiť j-forloop na lastF.
Mal by vyzerať takto:
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;
}
}