Skip to main content

코딩 인터뷰 솔루션을 개선하는 3 가지 방법-Muse

Day 1 Keynote | Oculus Connect 6 (유월 2025)

Day 1 Keynote | Oculus Connect 6 (유월 2025)
Anonim

그래서 당신은 있습니다. 안심 지쳤다. 면접관이 묻는 까다로운 코딩 문제를 해결하기위한 접근 방식이 마침내 완성되었습니다. 어쩌면 화이트 보드에 한 줄씩 작성했을 수도 있습니다. 그리고 당신은 좋은 시간을 보냈습니다! 회의에 20 분 밖에 안 남았습니다. 당신의 면접관은 감동해야합니다.

권리?

"이것은 효과가 있지만 더 효율적으로 수행하는 방법에 대한 아이디어가 있습니까?"

당신의 마음이 가라 앉습니다. 까다로운 알고리즘 디자인 부분을 끝냈다 고 생각했습니다! 문제를 해결하기 위해 더 많은 방법을 생각하려고하지만 이미 생각한 것은 접근 방식뿐입니다.

이것은 거의 모든 사람에게 발생합니다. 그들이 바보이기 때문이 아닙니다. 대부분의 사람들은 알고리즘의 효율성을 향상시킬 수있는 방법이 없기 때문입니다.

그러나 진실은 충분합니다. 다음에 문제가 발생하면이 세 가지 일반적인 접근 방식을 적용 해보십시오.

1. 해시 맵 사용

맞습니다. 해시 맵 / 연관 배열 / 사전 (사용중인 프로그래밍 언어에 따라 많은 이름으로 표시됨)에는 알고리즘의 런타임을 중단시키는 마술 같은 기능이 있습니다.

예를 들어, 질문이 숫자 배열에서 가장 반복되는 숫자를 찾는 것이라고 가정하십시오.

당신의 첫 번째 생각은 루프에 뛰어들 것입니다. 우리의 각 숫자에 대해, 그 숫자를 알아 내고 그것이 가장 큰 숫자인지 확인하십시오. 각 번호의 수는 어떻게 얻습니까? 배열을 반복하면서 발생 횟수를 세어보세요! 우리는 두 개의 중첩 루프에 대해 이야기하고 있습니다. 의사 코드에서 :

def get_mode (nums) : max_count = 0 mode = 숫자의 potential_mode에 대해 null : our_array의 숫자에 대해 count = 0 : count> = max_count : mode = potential_mode max_count = count return mode

현재 배열의 각 항목에 대해 전체 배열을 한 번 반복하고 있지만 더 잘 수행 할 수 있습니다. 큰 O 표기법에서는 총 O (n 2 ) 시간입니다.

카운트를 해시 맵에 저장하면 (숫자를 카운트로 매핑) 배열 (O (n) 시간을 한 번만 걸어서)으로 문제를 해결할 수 있습니다.

def get_mode (nums) : max_count = 0 mode = null counts = new HashMap, potential_mode에 대해 0에서 각 값을 0으로 시작 : counts> max_count : mode = potential_mode max_count = counts return mode

훨씬 더 빨리!

2. 비트 조작 사용

이렇게하면 팩과 차별화됩니다. 모든 문제에 적용되는 것은 아니지만 뒷주머니에 보관하고 적시에 파열하면 록 스타처럼 보일 것입니다.

예를 들면 다음과 같습니다. 한 번만 나타나는 숫자 하나를 제외하고 모든 숫자가 두 번 나타나는 숫자 배열이 있다고 가정합니다. 우리는 외롭고 반복되지 않는 숫자를 찾는 함수를 작성하고 있습니다.

첫 번째 본능은 우리가 그것에 대해 이야기했기 때문에 해시 맵을 사용하는 것일 수 있습니다. 그것은 좋은 본능입니다! 그리고 이것도 효과가 있습니다. 우리는 매우 유사한“카운트”맵을 만들어 어느 카운트가 1 카운트로 끝나는 지 알 수 있습니다.

그러나 더 좋은 방법이 있습니다. 비트 조작에 익숙하다면 XOR에 익숙 할 것입니다. XOR에서 특별한 한 가지는 숫자를 XOR하면 비트가 0으로“취소”된다는 것입니다.이 문제에 대해 배열의 모든 숫자를 함께 XOR하면 한 숫자 만 남습니다. 취소하지 마십시오 :

def find_unrepeated (nums) : num 단위의 숫자에 대해 unrepeated = 0 : 반복되지 않음 = 반복되지 않음

3. 상향식으로 이동

숫자 n이 주어지면 "n 번째"피보나치 수를 출력하는 함수를 작성하십시오. 이것은 고전적이며 재귀에 매우 적합합니다.

def fib (n) : n이 0 또는 1 인 경우 리턴 1 리턴 fib (n-1) + fib (n-2)

그러나 간단한 재귀 답변만이 아닙니다! 이 기능이 무엇을하는지 신중하게 생각하십시오. n이 5라고 가정합니다. 답을 얻으려면 fib (4) 및 fib (3)을 재귀 적으로 호출합니다. 이제 fib (4)에 대한 호출은 무엇을합니까? fib (3) 및 fib (2)를 호출합니다. 그러나 우리는 이미 fib (3)을 호출했다고 말했습니다! 이 귀여운 재귀 함수는 많은 반복 작업을 수행합니다. 총 시간 비용은 O (2 n )로 밝혀졌습니다. O (n 2 )보다 나쁩니다.

n을 재귀 적으로 1로 낮추는 대신 1에서 n으로“아래에서 위로”갑시다. 이를 통해 재귀를 건너 뛸 수 있습니다.

def fib (n) : previous = 0 previous_previous = 1 ~ n 범위의 i에 대해 1 : current = previous + previous_previous previous_previous = 이전 이전 = 현재 리턴 전류

코드는 더 길지만 훨씬 효율적입니다! O (n) 시간까지. 재귀 알고리즘을 언 롤링하면 추가로 공간을 절약 할 수 있습니다. 이러한 모든 재귀 호출은 호출 스택에 누적되며 메모리에 저장되고 공간 비용에 포함됩니다. 우리의 재귀 함수는 O (n) 공간 비용을 가졌지 만이 반복적 인 함수는 O (1) 공간을 차지합니다.

다음에 면접관이 솔루션의 효율성을 향상 시키라고 요청하면 이러한 전략을 살펴보고 도움이되는지 확인하십시오. 충분한 연습을하면 최적화 된 솔루션으로 바로 뛰어 들어보다 순진한 솔루션을 건너 뛸 수 있습니다. 그리고 그것은 큰 일입니다. 그것은 단지 당신이 더 나은 면접관이되고 있다는 것을 의미하는 것이 아니라 더 나은 엔지니어가되고 있다는 것을 의미합니다.