독특한 JavaScript 면접 도전

팀 왜?!코드 리뷰로 돌아온 것을 환영합니다. 매주 Dev.to에서 독점적으로 발표하는 일련의 코드 면접 도전과 직업 관련 내용입니다.저는 엘리자베스 그로스입니다. Coderbyte에서 저를 알게 될 것입니다. 이 사이트는 어떤 단계의 개발자가 다음 공사 업무를 얻도록 돕는 데 주력하고 있습니다.아니면, 당신은 아마도 나의via를 들어 본 적이 있을 것이다. 이것은 사용자가 수십 개의 회사에서 그들을 위해 흥미를 느끼는 역할에 대해 소개를 요청하는 것을 돕는 도구이다.
이 시리즈를 쓰는 가장 좋은 부분은 당신들 모두를 이해하고 동력과 열정이 넘치는 개발자 커뮤니티로서 그들의 인코딩 기술을 향상시키는 데 열중하는 것입니다.더 많은 힌트와 기교, 그리고 개발자의 생활 방식에 대한 내용을 원하신다면 다음 Instagram @elisabethgross568을 주십시오.나는 내가 뉴욕에서 일하는 것을 좋아하는 카페, 내가 가장 좋아하는 재생 목록, 인코딩할 때 듣기, 등등을 붙일 것이다.나는 지체하지 않고 다시 너희들과 사귀고 싶다.자, 잡담은 그만하고 지난주에 도전한 해결 방안을 토론합시다.

솔루션


이 해결 방안은 수평면에 존재할 수 있는 수량을 찾아서 층마다 화합을 구하여 총 부피를 얻는다.모든 수평면에서 우리는 최고치나 물이 존재할 수 있는 경계를 찾은 다음에 최고치의 지수를 빼고 그들 사이에서 물을 수집할 수 있는 공간을 얻을 수 있다.이것은 일부 코드로 가시화하기 더욱 쉬울 것이다.

Pro 팁


이 문제는 보조 함수를 구축할 수 있는 절호의 기회이다.일반적으로 하나의 알고리즘 도전을 해결할 때 해결해야 할 문제가 많으면 더욱 일반적인 개념부터 면접 과정에서 처리할 수 있는 조수 함수를 삽입하는 것이 도움이 된다.이것은 면접관에게 두 가지 일을 전달했다.우선, 당신은 문제의 더 큰 개념을 이해하고 수수께끼의 작은 구축 블록으로 구성된 미니 노선도를 구축할 수 있습니다. 이런 구축 블록은 최종적으로 당신의 알고리즘이 될 것입니다.그 다음으로, 너는 세부적인 것에 시달리지 않을 것이다.내가 누군가를 인터뷰할 때, 그들은 왕왕 초기에 알고리즘의 일부분에 빠졌고, 우리는 지금까지 알고리즘의 진정한 핵심에 도달하지 못했다.보조 함수를 삽입하면 처음부터 기본 구조에 집중하고 남은 시간에 이 보조 함수를 채울 수 있습니다.

function totalWaterVolume(arr) {

    // first, we find the 'maxHeight’ which is the highest peak in the water collector
    const maxHeight = Math.max(...arr)

    let totalVolume = 0

    // this loop starts at the maxHeight then decrements the height
    for (let horizontalLevel = maxHeight; horizontalLevel > 0; horizontalLevel--) {

        // 'peaksAtHorizontalLevel' is set to the return value of our first helper function 'peakIndicesMaker' which will be an array of indices of rain collector walls that exist at that level
        var peaksAtHeightLevel = peakIndicesMaker(arr, horizontalLevel)

        // 'vol' is then incremented by the volume that exists at that level, returned from our second helper function 'volAtLevel'
        totalVolume += volAtLevel(peaksAtHeightLevel)
    }

    // total volume is returned
    return totalVolume
}
우리가 지금까지 한 일을 설명하는 데 도움을 주는 예를 봅시다.
주어진 정수조 [0, 3, 0, 1, 0, 0, 0, 1, 0, 2], 우리의 빗물 수집기는 다음과 같다-

우선 우리는 maxHeight을 얻었고 우리의 예시에서 3이다.우리는 3부터 모든 수평면에서 순환할 것이다.peakIndicesMaker 함수 구축을 시작합니다!이 함수는 빗물 수집기의 모든 수평층의 최고치로 되돌아가야 한다는 것을 기억하십시오.
/* This function takes the original array, as well as the height level we are looking at, and returns an array of indices where reservoir walls exist */
function peakIndicesMaker(arr, level) {

    const peakIndices = []

    // loop over the entire array
    for (let i = 0; i < arr.length; i++) {

        // if the wall height present at each index is at least the height of the given level then that index is pushed to the output array
        if(arr[i] >= level) {
            peakIndices.push(i)
        }
    }

    // array of indices is returned
    return peakIndices
}
우리의 예시에 따르면 레벨 3은 [1](인덱스 1곳에서 최고치만 있음), 레벨 2는 [1, 9](인덱스 1과 9에서 최고치가 두 개), 레벨 1은 [1, 3, 7, 9](인덱스 1, 3, 7, 9에서 최고치가 네 개임)을 되돌려준다.
모든 등급의 최고치 지수를 얻으면 그들 사이의 공간을 찾을 수 있습니다. 이것은 최종적으로 우리에게 그곳에 수집된 물의 양을 제공할 것입니다!코드에서 어떻게 되는지 봅시다.
/* The distance between the two walls at the same height will also be the volume of water held between them. */
function volAtLevel(peakIndices) {

    let levelVol = 0

    // if there is only one wall at the height currently being calculated, there cannot physically be any water at that level. In this case, we return 0 volume.
    if (peakIndices.length === 1) {
        return 0
    } else {

        // levelVol is incremented for each 'pair' of walls at that level. It is important to note that we are comparing each wall to its adjacent neighbor located at the next index in the array. Therefore the last element in the array could not possibly hold water to its right.  This is because no wall exists at that level beyond the last wall
        for (let i = 0; i < peakIndices.length-1; i++) {

            // Measure the right side of one wall (this is why we look at peakIndices[i] + 1 and not just peakIndices[i]) to the left side of its neighbor
            levelVol += (peakIndices[i + 1] - (peakIndices[i] + 1))

        }
    }

    // the level volume is then returned after all pairs have been summed.
    return levelVol
}
우리의 예시에 따르면, 첫 번째 수평 단계 (고도=3), 우리는 0을 되돌려줍니다. 왜냐하면 최고치 색인만 있기 때문입니다.

다음 단계(고도=2)에 대해 우리는 두 개의 최고치가 있다[1,9].우리는 9(두 번째 최고치의 지수)에서 2(첫 번째 최고치의 지수 더하기 1)를 빼서 7을 얻었다.

다음 단계(고도=1)에 대해 우리는 4개의 최고치[1, 3, 7, 9]를 가지고 있다.우리는 3(두 번째 최고치의 지수)에서 2(첫 번째 최고치의 지수 더하기 1)를 빼서 1을 얻었다.그리고 7(세 번째 최고치의 지수)에서 4(두 번째 최고치의 지수 더하기 1)를 빼면 3을 얻는다.마지막으로 우리는 9(제4봉의 지수)에서 8(제3봉의 지수 더하기 1)을 빼서 1을 얻었다.

총 볼륨은 레이어당 모든 볼륨의 합계이며 이 경우 12입니다.이렇게!다음 주에 봐요!

좋은 웹페이지 즐겨찾기