我嘗試 使用 Java解決https://leetcode.com/problems/maximum-subarray/submissions/我通常在在線提交之前使用 Eclipse 嘗試這些事情。在這里,我在 Eclipse 中附加了代碼public class PrintAnnotationExample{public static void main(String[] args) { int index = 0; int max =0; int temp = 0; int[] test = new int[] {-2,1,-3,4,-1,2,1,-5,4}; while(index<test.length) { temp+= test[index]; if(temp <0) { while(index<test.length-1 && test[index]<0) { ++index; } temp = 0; } max = (max >= temp ) ? max : temp; ++index; } /// System.out.println(max); }}有效!預期的輸出是 6,它也是 6。但是,在 Leetcode 提交頁面中,它不起作用class Solution {public int index = 0;public int max =0;public int temp = 0;public int maxSubArray(int[] nums) { while(index<nums.length) {//?? ???? ?? ???? temp+= nums[index]; if(temp <0) { while(index<nums.length-1 && nums[index]<0) { ++index; } temp = 0; } max = (max >= temp ) ? max : temp; ++index; } return max;}它向我顯示 1,而不是 6...很奇怪,可能是我對 Java 語義有什么誤解。
1 回答

手掌心
TA貢獻1942條經驗 獲得超3個贊
您在 Eclipse 和 Leetcode 中執行的代碼明顯不同,因此您需要關注它們之間的差異……而不是(錯誤地)斷定存在編譯器/語言差異。
區別之一是在 Eclipse 版本index
中,max
和temp
是局部變量。在 Leetcode 版本中,它們是實例變量,不會在每次調用方法時都被初始化。如果 LeetCode 一次實例化你的類并多次調用該方法,這將導致不正確的行為。
可能是我對 Java 語義有什么誤解。
也許?;蛘哌@可能只是一個錯誤。
但無論哪種方式,都不建議使用實例變量來保存方法調用的狀態。使用局部變量代替:
為此使用局部變量可以避免您犯的錯誤;即忘記重新初始化。
為此使用實例變量使方法不可重入;即對方法的并發或重疊調用將相互干擾。如果方法被遞歸調用,或者從多個線程調用,這將是有問題的。
添加回答
舉報
0/150
提交
取消