簡體   English   中英

Leetcode 3 求和不同的答案 python vs javascript

[英]Leetcode 3 sum different answer python vs javascript

3 和問題是一個眾所周知的編碼面試問題。 它聲明如下:

給定一個 integer 數組 nums,返回所有滿足 i,= j, i,= k 的三元組 [nums[i], nums[j], nums[k]]。 並且 j != k,以及 nums[i] + nums[j] + nums[k] == 0。

我了解該算法並將解決方案編碼為 python,但我最近嘗試將下面的 python 代碼翻譯成 javascript,但我得到的答案不正確。

這對我來說很奇怪,因為代碼是完全翻譯的,一行一行的。 除非 javascript 的遞歸運行時堆棧在后台具有 python 的不同實現(不太可能)。 為什么代碼在[-1,0,1,2,-1,-4]上給出不同的結果還有更多原因嗎?

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        def kSum(nums: List[int], target: int, k: int, startIndex: int) -> List[List[int]]:
            if k == 2:
                ts = twoSum(nums, target, startIndex)
                return ts
            
            res = []
            for i in range(startIndex, len(nums)):
                currNum = nums[i]
                takeCurr = target - currNum
                if i == 0 or nums[i - 1] != nums[i]:
                    found = kSum(nums, target=takeCurr, k=k-1, startIndex=i+1)
                    for subset in found:
                        temp = [currNum] + subset
                        res.append(temp)
            return res

        def twoSum(nums: List[int], target: int, startIndex: int) -> List[List[int]]:
            res = []
            lo = startIndex
            hi = len(nums)-1
    
            while (lo < hi):
                curr_sum = nums[lo] + nums[hi]
                if curr_sum < target:
                    lo += 1
                elif curr_sum > target:
                    hi -= 1
                else:
                    res.append([nums[lo], nums[hi]])
                    lo += 1
                    while (lo < len(nums) and nums[lo] == nums[lo-1]):
                        lo+=1

            return res

        nums.sort()
        return kSum(nums, target=0, k=3, startIndex=0)
function threeSum (nums) {
    function kSum(nums, target, k, startIndex) {
        if (k===2) {
            let ts = twoSum(nums, target, startIndex);
            return ts;
        }

        let res = [];
        for (let i = startIndex; i < nums.length; ++i) {
            const currNum = nums[i];
            const takeCurr = target - currNum;
            if (i === 0 || nums[i-1] != nums[i]) {
                let found = kSum(nums, target=takeCurr, k=k-1, startIndex=i+1);
                for (const subset of found) {
                    let temp = [currNum].concat(subset);
                    res.push(temp);
                }
            }
        }
        return res;
    }

    function twoSum(nums, target, startIndex) {
        let res = [];
        let lo = startIndex;
        let hi = nums.length-1;
        while (lo < hi) {
            const curr_sum = nums[lo] + nums[hi];
            if (curr_sum < target) {
                lo++;
            }
            else if (curr_sum > target) {
                hi--;
            }
            else {
                res.push([nums[lo], nums[hi]]);
                lo++;

                while (lo < nums.length && nums[lo] === nums[lo-1]) {
                    lo++;
                }
            }
        }
        return res;
    }
    
    nums.sort(function(a,b) { return a-b;});
    return kSum(nums, target=0, k=3, startIndex=0);
}






JavaScript不支持命名為 arguments。這會導致您的代碼以意想不到的方式工作,因此應該刪除。

因為您在嵌套作用域的 args 中使用相同的變量名稱,所以當使用命名 arguments 時,您將覆蓋外部 scope 中的變量值。

簡單示例:

let a = 1;
foo(a=2);
console.log(a); // 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM