최근에는 상하이에서 40 °의 시원한 날씨에 일자리를 찾고 있습니다. 나는 너무 행복하다고 느낍니다. 인터뷰 할 때마다, 나는 거기에 앉아서 오랫동안 땀을 흘려야합니다. 나는 세상에 대한 깊은 사랑을 느낍니다. 나는 주제로 돌아왔다. 인터뷰 중에 나는 몇 가지 서면 시험을 보았습니다. 한 가지 질문이 있습니다. 실제 작업에서 결코 접지한 적이 없기 때문에주의를 기울입니다. 질문은 다음과 같습니다.
배열이 있습니다 : var arr = [1,2,1,3,3,2,4,6,3]는 처리하여 정규 분포로 변경됩니다 : [1,2,3,3,6,4,3,2,1].
나는 정규 분포를 간단히 설명하겠습니다. 실제로 처리 된 배열을 대략 이해할 수 있습니다. 두 끝은 작고 중간은 크다. 좌표 축에 반사 된 일반 곡선은 시계 모양이며 양쪽 끝은 낮고 중간 높이입니다. 곡선이 종 모양이기 때문에 왼쪽과 오른쪽과 오른쪽 대칭이므로 사람들은 종종 시계 모양의 곡선이라고 부릅니다.
이것은 인터뷰의 마지막 질문입니다. 내가 여기에 가져 왔을 때, 나는 단단했고 날씨는 뜨겁고 목이 마르고 배고프다. 프론트 데스크에있는 소녀는 너무 좋아 보였습니다 (말도 안되는 말을 멈추십시오. 알고리즘이 약했기 때문입니다 ...). 약간의 생각 후에, 나는 다음 코드를 썼습니다.
var arr = [1,2,1,3,3,2,4,6,3] ~ (함수 (arr) {var temp = [], i = 0, l = arr.length, sortarr = arr.sort (a, b) {return ab}) // 먼저 작게 배열을 획득하여 [1, 1, 2, 2, 3, 3, 3, 4, 6]. if (i%2 == 0) {temp [i/2] = sortarr [i] // 첨가 숫자 순서대로 위트 스크립트를 전면} else {temp [l- (i+1)/2] = sortarr [i] // 홀수를 홀수 순서대로 앞쪽으로 올려 놓습니다. 완벽한}) (ARR)그것이 필기 시험 이었기 때문에, 나는 한동안 내 마음 속에 프로그램을 묘사하고 큰 문제가 없다고 느꼈고 종이를 넘겨 주었다. 나중에 면접관은 시험지를보고 인터뷰 중에이 질문을 언급하지 않았습니다. 그래서 나는이 방법에 아무런 문제가 없다고 생각했기 때문에 인터뷰 중에 다시 묻지 않았습니다. 그러나 돌아 오는 길에 갑자기 다음과 같은 상황을 생각했습니다.
var arr = [1,2,3,4,5,6,7,8,9] // 정기적 인 증분 배열 ~ (함수 (arr) {var temp = [], i = 0, l = arr.length, arr.sort (a, b) {return ab}) {i <l; i ++) {if [i/2 = 0)} {temp [l- (i+1)/2] = sortarr [i]}} console.log (temp) // [1, 3, 5, 7, 9, 8, 6, 4, 2] 문제가 발생했습니다.예, 이런 식 으로이 배열의 왼쪽과 오른쪽 부분은 대칭이 아니며 9는 중심으로, 왼쪽에는 1+3+5+7 = 16, 오른쪽에는 2+4+6+8 = 20입니다. 왼쪽이 빛이고 오른쪽이 무겁고 균일 한 정규 분포가 아니라는 것이 분명합니다. 배열이 커지면 문제가 점점 더 심각해집니다.
선 스트랩. . . . 나는 꽃이 피기위한 새싹이다. 나를 이렇게 대하지 마십시오. . .
이전 코드를 사용할 수 없으므로 솔루션을 다시 생각할 수 있습니다. 실제로, 문제의 핵심은 배열의 왼쪽과 오른쪽이 동일하거나 대략 동일하도록하는 것입니다. 홀수 배열이든 짝수 숫자이든, 배열은 두 부분으로 나눌 수 있습니다 (홀수 숫자의 최대 값은 짝수 배열로 간주 될 수 있습니다. 여러 동일한 최대 값이 있더라도 중요하지 않습니다. 작은 것에서 큰 값으로 정렬하면 마지막 값을 제거하면됩니다). 또는 위의 방법에 따르면, 첨자가 짝수 인 경우 홀수가 홀수 일 때 왼쪽과 오른쪽에 놓으십시오. 오른쪽에 놓으십시오. 왼쪽과 오른쪽에서 배열을 성장시키는 과정에서 배열의 길이가 같을 때 왼쪽과 오른쪽의 합을 비교하십시오. 정상적인 상황에서는 작고 큰 것으로 정상되기 때문에 오른쪽은 왼쪽보다 커지고 오른쪽에 첫 번째를 바꾸고 왼쪽의 마지막 것을 교체하여 균형의 목적을 달성합니다. 코드는 다음과 같습니다.
var arr = [1,2,3,4,5,6,7,8,9], Sortarr = Ar temp_left.push (eq) : temp_right.unshift (eq) if (i> 1) {if (temp_left.length == temp_right.light &&! compare (temp_left, temp_right)) {랩 (temp_left, temp_right) // 왼쪽보다 왼쪽보다 더 크고 오른쪽이 retoged} temp_left.concat (temp_right)} // 배열 합 함 함수 sum (arr) {return eval (arr.join ( "+")); } // 배열 비교 함수 비교 (arr1, arr2) {return sum (arr1)> = sum (arr2)} // 오른쪽 함수 랩 (l, r) {var m = r.shift () r.unshift (l.pop ()) l.push (m)} console.log (get) // 7 5, 3, 2]이런 식으로 전체 정규 분포는 훨씬 더 균일 할 것입니다. 효과를보기 위해 몇 세트의 테스트 세트를 수행하십시오.
ARR = [1,333,444,555,66,7788,909] Console.log (Sort (ARR)) // [1,444,909, 7788,555,333,66] ARR = [168.6,17.5,174.2,189.3,167.2,177.6,167.8,175.5] Console.log (Sort (ARR)) // 1167.2,174.2,175.5,189.3,177.6,177.5,168.6,8]
꽤 좋아 보인다. 작은 사이트에는 CLIPTON을 클릭하여 C ++로 완료된 또 다른 기사가 있습니다. 그러나이 기사의 최종 결과는 균일 한 정규 분포가 아니었지만 첫 번째 프로그램과 유사했습니다.
C ++에 대해 많이 알지 못하며 볼 수있는 여러 결과를 실행하지 않았습니다. 관심있는 학생들은 비교로 시도 할 수 있습니다.
Chrome 의이 기사의 모든 프로그램 만 테스트했습니다. 다른 브라우저에 문제가있는 경우 메시지를 남기고 싶습니다. 사실, 이것은 어렵지 않습니다. 레코드로 사용하고 필요할 때 사용할 수 있습니다.