給定一個長度為N的陣列和一個整數x,你需要找到并回傳陣列中整數x的最后一個索引。如果它不存在于陣列中,則回傳-1。
最后索引意味著--如果x在陣列中出現了多次,則回傳x在陣列中最后出現的索引。
你應該從0開始遍歷你的陣列,而不是從(N - 1)開始。 遞回地做這件事。陣列中的索引是從0開始的。
輸入格式:
行 1 : 一個整數N,即陣列的大小。
行 2 : N個整數,是陣列的元素,用空格分隔
行 3 : 整數x
輸出格式:
最后索引或-1。
約束條件。
1 <=N <=10^3
輸入樣本:
4
9 8 10 8
8
輸出樣本:
3
基本上,我們應該以遞回的方式來做這件事,誰能驗證一下我的代碼,我是否正確地使用了遞回?
public class Solution {
static int idx = -1;
static int helper(int input[] 。int x ,int i)/span>{
if(i == input.length){
return idx;
}
else if(input[i] == x){
if(i > idx ){
idx = i;
}
}
return helper(input,x,i 1) 。
}
public static int lastIndex(int input[] 。int x) {
/* 你的類應該被命名為Solution。
* 不要寫main()。
*不要讀取輸入,它是作為函式引數傳遞的。
* 回傳輸出,不要列印它。
* 接受輸入和列印輸出是自動處理的。
*/
return helper(input,x,0) 。
}
}
評論中出現了問題本身
uj5u.com熱心網友回復:static int idx = -1;
這是個壞主意,因為它是全域可變的狀態。
假設你的main方法做的第一件事是呼叫lastIndex(new int[]{1, 2, 3, 4, 5}, 5):你會得到4的結果,正如預期。
但是,如果你呼叫lastIndex(new int[]{1, 2, 3, 4, 5}, 1)/code>呢?你會再次得到結果4。嗯?
這是因為你在運行lastIndex后沒有重置idx。你可以在第一次呼叫helper之前重置它:
public static int lastIndex(int input[] 。int x) {
idx = -1;
return helper(input, x, 0)。
}
但是你仍然有一個問題,那就是其他東西(另一個執行緒)也可以來重置它:你可能得到正確的答案;你可能得到-1;你可能得到另一個執行緒的lastIndex呼叫的中間或最終結果。
這一切都可以通過不擁有一個靜態欄位idx來輕松避免:將其作為一個額外的引數傳遞給helper。因為方法引數是有效的區域變數,這些是堆疊限制的,所以沒有看到其他執行緒的idx值的風險。
static int helper(int input[], int x ,int i, int idx) {
// ...
}
public static int lastIndex(int input[] 。int x) {
return helper(input, x, 0, -1)。
}
uj5u.com熱心網友回復:
正如Andy所說,你應該在你的helper和lastIndex函式中把idx作為一個引數,并在每次呼叫lastIndex時用-1啟動該引數。因為按照你現在的做法,讓我們假設lastIndex被第一次呼叫,并將idx的值改為8(因為對于你傳遞的第一個陣列,索引是8)。之后你重新呼叫同一個方法,但這次使用的是一個長度小于8的陣列;i永遠不會大于idx,因此這次回傳的結果將是錯誤的(8)。
還要注意的是if(i > idx )檢查是不必要的,因為你總是把i 1傳遞給下一個呼叫,因此i將總是大于idx。
public class Solution {
static int helper(int input[], int x ,int i, int idx) {
if(i == input.length){
return idx;
}
else if(input[i] == x){
idx = i;
}
return helper(input,x,i 1, idx)。
}
public static int lastIndex(int input[] 。int x) {
/* 你的類應該被命名為Solution。
* 不要寫main()。
*不要讀取輸入,它是作為函式引數傳遞的。
* 回傳輸出,不要列印它。
* 接受輸入和列印輸出是自動處理的。
*/
return helper(input,x,0,-1) 。
}
uj5u.com熱心網友回復:
據我所知,你不能改變輔助方法的簽名和引數,因為這似乎是一個要求。 但你可以通過以下方式來滿足主方法和輔助方法的引數:
public static int lastIndex(int[] input, int x) {
if (input == null) {
return -1;
}
return helper(input, x, 0)。
}
public static int helper(int[] input。int x, int i) {
if (i == input.length) {
return -1;
}
if (input[input.length-i-1] == x) {
return input.length-i-1。
}
return helper(input, x, i 1) 。
}
不幸的是,盡管索引是遞增的,但這是在反向檢查陣列,這也是禁忌。 如果它由一個自動系統運行,它可能會通過,因為它符合幫助器的簽名。 如果由人類來審查,可能就不會通過。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/319287.html
標籤:
上一篇:如何在控制器中制作一個無盡的會話
下一篇:forEach/函式遞回和回傳值
