왜 자바스크립트는 사실상 훌륭한 LeetCode/인터뷰 언어인가


사실 가장 좋은 언어는 네가 익숙한 언어다.
그러나 만약 당신이 엄격하지 않은 유형의 언어를 배우고 있거나 몇 가지 선택 사이에서 배회하고 있다면, 왜 JS가 시험해 볼 가치가 있는지 몇 가지 이유를 제시하고 싶습니다.

요 며칠 사람들은 모두 LeetCode의 고역을 하고 있다.
만약 당신이 LeetCode에 익숙하지 않다면, 이것은 짧은 시간 안에 면접 유형 코드 도전을 연습하는 방법이다.본고는 HackerRank,CodeSignal,HireVue든 다른 많은 테스트 서비스든 실제 면접 서비스에도 적용된다.
초보자들에게 파이톤, 자바, C++는 리트코드가 배워야 할'3대 거두'라는 점이 자주 중복된다.
사람들은 흔히 C++/자바는 속도가 매우 빠르고 광범위한 표준 라이브러리가 있으며 유형이 엄격하기 때문에 좋은 선택이라고 말한다.C++는 메모리 관리와 교체기에 있어서는 좀 복잡하지만 속도에 있어서는 균형을 잡아야 한다.자바는 지루하기로 유명하다. 인터뷰의 급속한 교체 정신에 어긋난다.
다른 한편, 사람들은 보통 파이톤을 좋아한다. 왜냐하면 이것은 위조 코드를 작성하는 것과 유사하기 때문에 초보자에게 매우 적합한 지역 사회를 가지고 교체 속도가 매우 빠르다.
나는 왜 자바스크립트가 인코딩 도전의 가장 좋은 선택일 수 있는지 (특히 파이톤의 대체품으로서) 몇 가지 이유를 소개할 것이다.
나의 추리에서, 나는 다른 언어와 다른 것을 피할 것이다. 왜냐하면 나는 익숙하지 않고, 기능적인 측면에서 말을 잘못하고 싶지 않기 때문이다.

#1) - 모든 것이 물체다 (이건 대박)
const object = {"key": "value"}

object.key // 'value' -- O(1) access/insertion time obv.
object.newKey = 'newValue'
object['key'] == object.key // true
// Easy to iterate (and it has fixed ordering)
Object.entries(object) // [ [ 'key', 'value' ], ... ]
대상은 매우 훌륭하고 유연하여 소프트웨어 개발에서 가장 중요한 데이터 관련이라고 할 수 있다.
나는'해시맵'유형의 데이터 구조가 수조보다 가치가 있고 사용도 광범위하다고 생각한다.흥미로운 사실: JS typeof([1]) // 'object'에서 심지어 수조도 대상이고 특수한 부가 속성만 있을 뿐이다.
그러나 본질적으로 우리는 그것들로 다른 언어의 집합/맵/사전을 대체할 수 있다. (나는 LeetCode 유형의 문제 중 상당히 높은 비율이 그것들을 필요로 한다고 확신한다.)삽입 순서를 유지해야 하는 문제에 대해서는 JS에서 Map()Set()을 사용할 수 있습니다.
우리는 또한 대상을 쉽게 사용하여 체인 시계, 나무, 그림, 시도 등을 표시할 수 있다!문제가 더욱 복잡한 알고리즘을 구축해야 할 때, 이 점은 매우 중요하다.
let graph = {
'1': {
   edges: [2,4,5]
},
'2': {
   edges: [...]
}
....
}

let trie = { 
a: {
   b: { c: {} },
   d: {}
}

#2) 때로는 엄격한 정적 입력이 매우 좋지만 속도가 아님
> [] + []
''
> {} + []
0
> [] + {}
'[object Object]'
// wtf https://www.destroyallsoftware.com/talks/wat
진정으로 유지보수가 가능하고 테스트가 가능하며 신뢰할 수 있는 코드는 약간의 타자 보조가 필요하다. 약간 가볍든 (TypeScript), 아니면 슈퍼 무겁든 (Rust).
그러나 이는 보통 빠르게 교체되는 균형(또는 auto)을 수반한다.
유형 강제 및 비정상 유형이 JS와 유사한 스크립트 언어(Python, Ruby)에서 어떻게 작동하는지 배우면 빠른 조작을 쉽게 할 수 있다.
본질적으로, 우리가 서로 다른 유형 (예를 들어 숫자, 문자열, 대상, 그룹) 을 비교하거나 조작할 때, 우리의 JS 엔진은 유형 강제에 최선을 다할 것이다. 이것은 우리에게 최초의 이상한 부작용을 가져올 수 있다.그러나 우리가 이 장점을 어떻게 활용하는지 예를 들자!
// Do a frequency count on an array 'a'
// and store it in a object 'o' {key: count}
const o = {}
a.forEach(e => { o[e] = o[e] + 1 || 1 } )
// if o[e] doesn't exist, it's 'falsy'
// we short-circuit logical OR to return 1
나는 기본적으로 이 코드를 사용해 왔지만, 이런 유형의 협동도 많았다. (특히 0,null, 정의되지 않은 값이 모두fasly 값이라는 것을 알고 있었다.)

원인 #3) JSON=JavaScript 객체 표현(web<3s)
이런 장점은 리코드 문제에 적합하지 않지만 집으로 가져가는 평가에 더욱 적합하다.적중과 API를 명중시키고 데이터 조작을 한 다음 다른 단점으로 보내는 작은 프로그램을 구축합니다.
이것이 바로 JS 구축의 목적으로 웹 서비스 사이에서 데이터를 조작하고 처리하는 것이다.거의 모든 API나 집으로 가져가는 평가는 어떤 방식으로 JSON과 관련된다. 그러나 JSON.stringify()JSON.parse() 같은 내장된 방법은 그것을 가볍게 만든다.
개인적인 경험에 의하면, 나는 HubSpot과 다른 많은 사람들과 평가를 한 적이 있다. 그들의 모든 정력은 평가의 진실한 업무에 집중되었다. JSON을 요청하고 해석하는 것보다 더 진실한 것은 없다.
나는 이 문제들을 아주 빠른 속도로 해결할 수 있다. 왜냐하면 나는 심사숙고한 후에 라이브러리나 모드를 설정할 필요가 없기 때문이다. 나는 단지 Axios/Node fetch를 사용하면 완전히 사용할 수 있는 대상을 얻을 수 있고, 나는 마음대로 그것을 조작할 수 있기 때문이다.
테스트에서도 JSON을 IDE에 붙이면 바로 효과적인 대상이 될 수 있다는 점에서 가치가 있다.

#4) 내장형 어레이 접근 방식을 통해 간편한 작업 수행
수조 문제는 가장 흔히 볼 수 있는 입력 데이터 구조이기 때문에 자주 그것들을 조작하고 교체할 것입니다.
나는 아주 좋은 그룹 방법을 빨리 열거할 것이다. 나는 리코더와 면접에서 이런 방법을 계속 사용하고 있다는 것을 발견했다. (면접관은 보통 이 방법이 어떤 문제를 신속하고 가볍게 해결할 수 있다는 것이 인상적이다.)

기본 데이터 조작(우리는 심지의 복잡성을 낮추고 JS에서 그룹을 창고와 대기열로 사용할 수 있다)
1) pop()
['1','2'].pop() // a = ['1'], returns '2'
2) push()
['1'].push('2') // a = ['1','2']
3) shift()
['1','2'].shift() // a = ['2'], returns '1'
4) unshift()
['2'].unshift('1') // a = ['1','2']
5) slice()
[1,2,3].slice(1,2) // a = [2, 3]
// selects from index start -> end (optional) -- negative start index works too

몇몇 교체 그룹 작업 (가장 유용한 순서에 따라)
1) forEach()
a.forEach((e,i) => console.log(e, i)) // [1,2,3] -> prints 1 0 2 1 3 2
// iterates through each element
2) map()
a.map(e => e+1) // [1,2,3] -> [2,3,4]
// returns a new array with per element manipulation
3) reduce()
a.reduce((accum,e) => accum += e, 0) // [1,2,3] -> 6
// returns value that results from the reduction
4) sort()
a.sort((a,b) => b-a) // [1,2,3] -> [3,2,1] 
// returns a new array sorted based on the call-back comparison
5) filter()
a.filter(e => e%2!==0) // [1,2,3] -> [1,3] 
// returns a new array based on elements where the return is truthy

엑스트라
1) 문자열을 배열로 변환하고 그 반대로(일반적)
> "string".split('')
[ 's', 't', 'r', 'i', 'n', 'g' ]
> [ 's', 't', 'r', 'i', 'n', 'g' ].join(' ')
's t r i n g'
2) reverse()
[1, 2, 3].reverse() -> returns [3,2,1]
3) every()
a.every(e => e > 0) // [1,2,3] -> true
// [-1, 2, 3] -> false 
// returns true if every element evaluates to true for the expression
4) some()
a.some(e => e > 4) // [1,2,3] -> false 
// returns true if any element evaluates true for the expression
각 배열 방법 이해 here

#5) JavaScript 실행 (V8)
실행 모델에 적응하기 위해 언어에 특정한 시간 초과를 조정해야 한다.그러나 인터넷과 친구들에게 들었듯이, 때로는 HackerRank에서 최상의 해결 방안을 찾을 수 있지만, 파이톤에서는 더 큰 테스트 용례에 대해 TLE (시간 제한 초과) 시간 초과가 나타난다고 한다.
더 큰 데이터 집합에서 실행할 염려가 없습니다. 자바스크립트를 사용할 때, 속도적으로 C++, 자바와 경쟁할 것입니다. (V8 자바스크립트 엔진이 그 중에서 주도적인 위치를 차지할 것입니다. (Chrome, Node.js)
기본적으로, 만약 당신이 가장 좋은 해결 방안을 얻거나, 심지어는 그것의 어떤 해결 방안에 접근할 수 있다면, 당신은 시간적인 측면에서 모든 숨겨진 테스트 용례를 통과할 것이다.
JS vs Python
JS vs C++
JS vs Java

기타 이점:
이런 것들이 반드시 하나의 유형에 완전히 부합되는 것은 아니지만, 나는 이러한 적극적인 요소를 제기하는 것이 매우 중요하다고 생각한다.
1) Object destructuring const { result } = { result: "answer" }2) Optional chaining animal?.color?.hexcode3)NPM/실-포장.json과 도서관에 대한 대량 방문으로 포장 관리가 수월해졌다
4) Spread operator Math.max(...a)

약간의 결점이나 혐오감:
1) 퇴적 구조 부족(최소 내장)
2) 직접 문자열 조작이 불편하다:charAt(), split(), splice()
3) 배열 슬라이스는 파이톤보다 깨끗하지 않은 느낌을 준다.
읽어주셔서 감사합니다!만약 당신이 어떤 생각이 있다면, 왜 JS가 인터뷰 작성/Leet Code에 대해 매우 좋거나 좋지 않은지 저에게 알려주세요.

좋은 웹페이지 즐겨찾기