EngTW / English-for-Programmers

《程式英文》:用英文提昇程式可讀性
977 stars 45 forks source link

1480. Running Sum of 1d Array #70

Closed twy30 closed 3 years ago

twy30 commented 3 years ago

https://leetcode.com/problems/running-sum-of-1d-array/

public class Solution
{
    public int[] RunningSum(int[] nums)
    {
        // 「輸入的數字」(複數)
        var inputNumbers = nums;

        // 「輸出值」
        var output = new int[inputNumbers.Length];

        output[0] = inputNumbers[0];

        for (int i = 1; i < output.Length; ++i)
        {
            output[i] = inputNumbers[i] + output[i - 1];
        }

        return output;
    }
}

請參考「刷 LeetCode 練習命名」 https://github.com/EngTW/English-for-Programmers/issues/69 😊

LPenny-github commented 3 years ago

新手中的新手來求教了 😅 (C#)

我還沒參考 LeetCode 的討論區,想先就第一個版本取得回饋,無論就命名、簡潔、易讀,或註解寫作各方面。

十分感謝。寫得很爛,我會努力的 orz

public int[] RunningSum(int[] nums)
        {
            // 1. 加總所有數字
            // 2. 先把最後一個數字記下來            
            // 3. 把總和填入最後一個數
            // 4. 把最後一個數減去原初最後一個數(步驟 2 的結果)
            // 5. 先把倒數第二個數字記下來
            // 6. 把結果記載倒數第二個數
            // 7. 重複 步驟 4 ~ 6
            // ---

            // 1. 加總所有數字
            int numsSum = nums[0];

            for (int i = nums.Length-1; i > 0; --i)
            {
                numsSum += nums[i];
            }

            // 2. 先把最後一個數字記下來
            int originalNumber = nums[nums.Length-1];
            // 3. 把總和填入最後一個數
            nums[nums.Length-1] = numsSum;

            for (int i = nums.Length-2; i >= 0; --i)
            {
                // 4. 把最後一個數減去原初最後一個數(步驟 2 的結果)
                int temp = nums[i+1] - originalNumber;
                // 5. 先把倒數第二個數字記下來
                originalNumber = nums[i];
                // 6. 把結果記載倒數第二個數
                nums[i] = temp;                
            }
            return nums;
        }
twy30 commented 3 years ago

@LPenny-github

新手中的新手來求教了 😅 (C#) 十分感謝。寫得很爛,我會努力的 orz

每個人都是從零開始學起的 😊

想先就第一個版本取得回饋,無論就命名、簡潔、易讀,或註解寫作各方面

就「命名」來說,以下是我對你的程式碼的第一印象,可以參考看看 😊

public int[] RunningSum(int[] nums)

我這幾天做了十來題的 LeetCode 題目,觀察到 LeetCode 很習慣用 "nums" 來表達 "numbers" 。

就「演練命名技巧」來說,我個人會儘可能採用美式英文字典上的拼法。

我的做法是另外宣告 inputNumbers 變數。

        // 「輸入的數字(複數)」
        var inputNumbers = nums;

另一種做法是更改 LeetCode 提供的方法簽名(method signature)。

public int[] RunningSum(int[] inputNumbers)

            // 1. 加總所有數字
            int numsSum = nums[0];

這裡我覺得 numsSum 有確實地表達了「所有數字的總和」的意思,而且易懂。


            // 2. 先把最後一個數字記下來
            int originalNumber = nums[nums.Length-1];

這裡的「最後一個數字」與 "original" 中間些微落差。

或許可以試試 "last unmodified number", 「最後一個未被更動的數字」。 🤔


                // 4. 把最後一個數減去原初最後一個數(步驟 2 的結果)
                int temp = nums[i+1] - originalNumber;

這裡用 temp 沒有問題。

就我的經驗, ttemp 都能確實表達 "temporary" 的意思,也都很容易懂。

LPenny-github commented 3 years ago

很清楚也很好懂,感謝 @twy30 大大! orz

twy30 commented 3 years ago

@LPenny-github

補充一點:

就我的經驗, t 或 temp 都能確實表達 "temporary" 的意思,也都很容易懂。

lddr99 commented 3 years ago

不知道現在還能不能參加?Ruby 版!

def running_sum(input_numbers)
    input_numbers.map.with_index do |num, index|
        input_numbers.slice(0, index + 1).sum
    end
end

ps. 剛轉戰 ruby 一陣子,ruby 會將最後值自動回傳,所以似乎大部分人不另外賦值來做 return,不知道其他人會不會也有看不習慣的問題

twy30 commented 3 years ago

@lddr99

歡迎 😊

    input_numbers.map.with_index do |num, index|

我不熟 Ruby, 但這 num, index 讀起來簡潔明瞭,能推敲出它們的用途。 👍


ps. 剛轉戰 ruby 一陣子,ruby 會將最後值自動回傳,所以似乎大部分人不另外賦值來做 return,不知道其他人會不會也有看不習慣的問題

很有趣,我自己是最習慣 C# 的語法,