В последние дни я ищу работу в прохладную погоду 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] ~ (function (arr) {var temp = [], i = 0, l = arr.length, sortarr = arr.sort (функция (a, b) {return ab}) // Сначала договориться об массивах от малого до большого для получения [1, 1, 2, 2, 3, 3, 3, 4, 6] для (1); 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, sortarr = arr.sort (a, b) {return ab}) для (; 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 = arr.sort (function (a, b) {return ab}), l = arr.length, temp_left = [], temp_right = [] sort sort (arr) {var i = 0 для (; i <l; i ++) {var eq = sortarr [i] i%2 = a (; temp_left.push (eq): temp_right.unshift (eq) if (i> 1) {if (temp_left.length == temp_right.length &&! compare (temp_left, temp_right)) {wrap (temp_left, temp_right) // Когда массив одинакова, а правая - правая, чем левая сторона at -atmer temp_left.concat (temp_right)} // Функция массивы суммы (arr) {return eval (arr.join ("+")); } // Функция сравнения массива Compare (arr1, arr2) {return sum (arr1)> = sum (arr2)} // Последний на левом обмене с первым на правой функции (L, R) {var m = R.Shift () R.Unshift (L.Pop ()) L.Push (M)} Console.Log (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Sort (Arr)) 3, 2]Таким образом, все нормальное распределение будет гораздо более равномерным. Сделайте еще несколько наборов тестов, чтобы увидеть эффект:
ARR = [1,333,444,555,66,7788,909] Консоль.log (Sort (ARR)) // [1,444,909, 7788,555,333,66] ARR = ARR = ARR = ARR = ARR = ARR = ARR = ARR = ARR = ARR [168,6,177,5,174,2,189,3,167,2,177,6,167,8,175,5] Консоль.log (Sort (Arr)) //=167,2,174,2,175,5,39,3,177,6,177,5,168,6,67,89,3,
Это выглядит довольно хорошо. На небольшом сайте есть еще одна статья, которая была нажати на просмотр, которая была завершена в C ++. Тем не менее, конечным результатом статьи не было единообразного нормального распределения, но это было похоже на мою первую программу.
Я не знаю много о C ++, и я не запускаю несколько наборов результатов, чтобы увидеть. Заинтересованные студенты могут попробовать это как сравнение.
Я только проверил все программы в этой статье в Chrome. Если есть какие -либо проблемы с другими браузерами, я надеюсь оставить сообщение, чтобы сообщить вам. На самом деле, эта вещь не сложно. Просто используйте его в качестве записи и можно использовать при необходимости.