我在這個編碼“挑戰”中掙扎。我需要在nums中查找原始值。如果它在那里,乘以 2 并重做整個事情。如果沒有更多相同的值,則回傳該值。
它適用于很多測驗用例,但我在除錯時遇到了一個奇怪的錯誤。在我迭代陣列并準備好回傳正確的值之后,它沒有回傳 16,而是再次呼叫findFinalValue并再次從 16 向下迭代到 4。
public class Main {
public static void main(String[] args) {
Solution s = new Solution();
int[] nums = {8,19,4,2,15,3};
System.out.println(s.findFinalValue(nums, 2));
}
}
class Solution {
public int findFinalValue(int[] nums, int original) {
for(int n: nums){
if(n == original){
original*=2;
findFinalValue(nums, original);
}
}
return original;
}
}
uj5u.com熱心網友回復:
猜測你的問題是你沒有正確實作遞回:
class Solution {
public int findFinalValue(int[] nums, int original) {
int found = original;
for(int n: nums){
if(n == original){
found = findFinalValue(nums, found * 2);
}
}
return found;
}
}
uj5u.com熱心網友回復:
它不是從 16 迭代到 4,而是遞回的作業原理。您需要將結果傳回或將其存盤在全域變數中。一旦在遞回中達到死胡同,它就會回溯并回到其原始狀態。
解決方案
class Solution {
public int findFinalValue(int[] nums, int original) {
int isPresent = false;
for(int n: nums){
if(n == original){
isPresent = true;
break;
}
}
if(isPresent) {
original = findFinalValue(nums, original*2);
}
return original;
}
}
坦率地說,可以先對陣列進行排序,然后再用二分查找來查找元素,另外,在下一個狀態中傳入的陣列可以減少直到索引讀完。因為原來已經變成了兩倍
uj5u.com熱心網友回復:
我不會使用遞回,但是因為我認為您在詢問遞回解決方案,所以我會這樣做:
public int findFinalValue(int[] nums, int original) {
return IntStream.of(nums).anyMatch(n -> n == original)
? findFinalValue(nums, 2 * original)
: original;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427337.html
上一篇:帶有彈簧的Mongodb,將所有行分組為一個并具有不同的值
下一篇:如何處理靜態方法中的點擊監聽器?
