HackerRank Js-Week2 6. Counting Valleys

    HackerRank

    An avid hiker keeps meticulous records of their hikes. During the last hike that took exactly steps steps, for every step it was noted if it was an uphill, U, or a downhill, D step. Hikes always start and end at sea level, and each step up or down represents a 1 unit change in altitude. We define the following terms:

    一個狂熱的登山者保持他們的詳細紀錄。在最後一次登山的期間走了剛好 steps 步數,在每一個步數中,如果是上坡會紀錄 U,下坡會紀錄 D。
    登山大部分開始和結束在海平面,每一個向上或向下都代表 1 的步數。我們定義如下:
    

    – A mountain is a sequence of consecutive steps above sea level, starting with a step up from sea level and ending with a step down to sea level.
    – A valley is a sequence of consecutive steps below sea level, starting with a step down from sea level and ending with a step up to sea level.
    Given the sequence of up and down steps during a hike, find and print the number of valleys walked through.

    - 一座山是一系列連續的海拔高度,從海平面上升到海平面下降。
    - 山谷是海平面以下的一系列連續步驟,從海平面下降開始,到海平面上升結束。
    給與登山旅行中,上下台階的順序,找出並打印走過的山谷數量。
    

    Example 1:

    steps = 8, path = [DDUUUUDD]
    The hiker first enters a valley 2 units deep. Then they climb out and up onto a mountain 2 units high. Finally, the hiker returns to sea level and ends the hike.
    

    solution:
    先將 path 陣列中的上下坡進行切割成單一步數,並宣告 count 步數與 valley 山谷數量。
    在遍歷迴圈的過程中,當水平線往下坡走時,則山谷數量 +1。
    過程中的 count 步數會計算 上坡+1 與 下坡 -1,以確保回到水平位置時(count = 0),再次出現山谷的次數做累加。

    Code 1: BigO(n)

    'use strict';
    
    const fs = require('fs');
    
    process.stdin.resume();
    process.stdin.setEncoding('utf-8');
    
    let inputString = '';
    let currentLine = 0;
    
    process.stdin.on('data', function(inputStdin) {
        inputString += inputStdin;
    });
    
    process.stdin.on('end', function() {
        inputString = inputString.split('\n');
    
        main();
    });
    
    function readLine() {
        return inputString[currentLine++];
    }
    
    /*
     * Complete the 'countingValleys' function below.
     *
     * The function is expected to return an INTEGER.
     * The function accepts following parameters:
     *  1. INTEGER steps
     *  2. STRING path
     */
    
    function countingValleys(steps, path) {
        // Write your code here
        let arrOfString = path.split("")
        let count = 0,
            valley = 0
        
        for (let i = 0; i < steps; i++) {
            if (count === 0 && arrOfString[i].toLowerCase() === "d") {
                count -= 1
                valley += 1
            } else if (arrOfString[i].toLowerCase() === "d") {
                count -= 1
            } else {
                count += 1
            }
        }
        return valley;
    }
    
    function main() {
        const ws = fs.createWriteStream(process.env.OUTPUT_PATH);
    
        const steps = parseInt(readLine().trim(), 10);
    
        const path = readLine();
    
        const result = countingValleys(steps, path);
    
        ws.write(result + '\n');
    
        ws.end();
    }
    
    

    FlowChart:
    Example 1

    steps = 8, path = [DDUUUUDD]
    
    step.1 i = 0, count = 0
    path = D
    count -= 1 //count = -1
    valley += 1 
    
    step.2 i = 1, count = -1
    path = D
    count -= 1 //count = -2
    
    step.3 i = 2, count = -2
    path = U
    count += 1 //count = -1
    
    step.4 i = 3, count = -1
    path = U
    count += 1 //count = 0
    
    step.5 i = 4, count = -1
    path = U
    count += 1 //count = 1
     
    step.6 i = 5, count = -1
    path = U
    count += 1 //count = 2
    
    step.7 i = 6, count = -1
    path = D
    count -= 1 //count = 1
    
    step.8 i = 7, count = -1
    path = D
    count -= 1 //count = 0
    
    return valley //1