Имеется массив чисел [1,2,3,-1] (числа могут быть любые)
необходимо из этого массива вывести самое близкое число к нулю и все другие равные ему по модулю.
Пока идей никаких нет( долго ломаю голову. Прошу помощи
Спустя 1 минута, 55 секунд (11.03.2011 - 12:09) Snus написал(а):
rocker
:D
$arr = array('9','5','54','3');
sort($arr);
echo $arr[0];
:D
Спустя 34 секунды (11.03.2011 - 12:10) Michael написал(а):
Цитата |
Пока идей никаких нет( долго ломаю голову. Прошу помощи |
и это говорит программист
Спустя 6 минут, 5 секунд (11.03.2011 - 12:16) rocker написал(а):
Цитата (Snus @ 11.03.2011 - 09:09) |
rocker$arr = array('9','5','54','3'); :D |
К сожалению это не javascript, но идея стоющая)
var arr= new Array [9,5,54,3];
arr.sort(function(a,b) { return a-b; } );
alert(arr[0]);
Сори, и правда вопрос был тупой) перегрузка наверное у меня) :D
Спустя 55 секунд (11.03.2011 - 12:17) twin написал(а):
Snus
Зачем так сложно?))
Зачем так сложно?))
$arr = array('9','5','54','3');
echo min($arr);
Спустя 3 минуты, 28 секунд (11.03.2011 - 12:20) rocker написал(а):
Цитата (twin @ 11.03.2011 - 09:17) |
Snus Зачем так сложно?)) $arr = array('9','5','54','3'); |
минимальное не всегда будет ближайшим у нулю , например -20, 1 1- ближайшее
Спустя 15 секунд (11.03.2011 - 12:21) Snus написал(а):
А блин ) я не увидел, что раздел Javascript.
twin
Можно и так ))
twin
Можно и так ))
Спустя 6 минут, 55 секунд (11.03.2011 - 12:27) rocker написал(а):
Нашел решение поделив основной массив на 2 1 - отрицательные числа, 2 положительные.
из отрицательного беру максимальное из положительного минимальное, сравниваю их по модул ... меньшее будет ближайшим к нулю.
Всем спасибо.
из отрицательного беру максимальное из положительного минимальное, сравниваю их по модул ... меньшее будет ближайшим к нулю.
Всем спасибо.
Спустя 9 минут, 42 секунды (11.03.2011 - 12:37) Snus написал(а):
rocker
Еще как вариант
Еще как вариант
function getNV($arr){
foreach($arr as $val) $arr2[abs($val)] = $val;
ksort($arr2);
return array_shift($arr2);
};
$arr = array('-20','6','34','-3','4','-10');
echo getNV($arr);
Спустя 23 минуты, 11 секунд (11.03.2011 - 13:00) rocker написал(а):
итогом будет
/**
* k - основной массив чисел
* Находим ближайшие к нулю
* 1. Делим основной массив на 2, 1 -отрицательные числа, 2 - положительные числа
* 2. Находим в 1 массиве максимальное число, а в 2 минимальное, сравниваем их по модулю
*/
var newArr = new Array(); // Итоговый массив куда запишем все ближайшие к нулю
var first = new Array(); // Первый массив
var second = new Array(); // Второй массив
x = 0;
var s = 0;
var l = 0;
while (x<k.length) {
/**
* Формируем первый массив, только отрицательные числа
*/
if (k[x] < 0) {
first[s] = k[x];
s++;
}
/**
* Формируем второй массив, только положительные числа
*/
if (k[x] > 0) {
second[l] = k[x];
l++;
}
x++;
}
/**
* Находим максимальное в первом массиве
*/
x = 0;
while(x<first.length){
Max=Math.max(first[0], first[x]);
x++;
}
/**
* Находим минимальное во втором массиве
*/
x = 0;
while(x<second.length){
Min=Math.min(second[0], second[x]);
x++;
}
/**
* Первым ближайшим к нулю будет меньший по модулю
*/
var near = Math.min(Math.abs(Max), Math.abs(Min));
/**
* Сканируем основной массив на наличие чисел равных по модулю самому ближнему к нулю
*/
l = 0;
x = 0;
while(x<k.length){
if (Math.abs(k[x]) == Math.abs(near)) {
newArr[l] = k[x];
l++;
}
x++;
}
Спустя 33 минуты, 26 секунд (11.03.2011 - 13:34) Snus написал(а):
rocker
О боже ) Это можно сделать 2 строчками.
массив
2 заветные строчки
вывод
О боже ) Это можно сделать 2 строчками.
массив
var arr = new Array('-20','6','34','-3','4','-10');
2 заветные строчки
function sortNumber(a,b){return Math.abs(a)-Math.abs(b);}
arr.sort(sortNumber);
вывод
alert(arr[0]);
Спустя 1 час, 8 минут, 32 секунды (11.03.2011 - 14:42) Michael написал(а):
var arr = [-100, -20, 19, 90, 300];
var min = Number.MAX_VALUE;
var res = null;
for (i = 0; i < arr.length; i++) {
var diff = Math.abs(arr[i]);
if (diff < min) {
min = diff;
res = arr[i];
}
}
alert(res);
Спустя 4 минуты, 51 секунда (11.03.2011 - 14:47) Snus написал(а):
Michael
Мой вариант лучше
Мой вариант лучше
Спустя 16 минут, 49 секунд (11.03.2011 - 15:04) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 13:47) |
Michael Мой вариант лучше |
потому что короче по количеству кода или потому что выполняет лишние(тяжелые) операции типа предварительной сортировки всего массива?
Спустя 5 минут, 58 секунд (11.03.2011 - 15:10) Snus написал(а):
Michael
Я тебя умоляю ) Ничего "лишнего" и "тяжелого" нет в моем варианте
Я тебя умоляю ) Ничего "лишнего" и "тяжелого" нет в моем варианте
Спустя 22 минуты, 46 секунд (11.03.2011 - 15:33) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 14:10) |
Michael Я тебя умоляю ) Ничего "лишнего" и "тяжелого" нет в моем варианте |
сравни просто один пробег по массиву с его сортировкой ...
Минимальный элемент найти, я так понял, ты тоже предлагаешь сначала отсортировать массив и вытащить первый?
Спустя 19 минут, 45 секунд (11.03.2011 - 15:52) Snus написал(а):
Michael
Многотонный массив без проблем моим вариантом обрабатывается. А ты чем подкрепишь слова?
К тому же, возможно автору понадобится вывести 3 наиболее приближенных числа к 0
Многотонный массив без проблем моим вариантом обрабатывается. А ты чем подкрепишь слова?
К тому же, возможно автору понадобится вывести 3 наиболее приближенных числа к 0
Спустя 47 минут, 35 секунд (11.03.2011 - 16:40) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 14:52) |
Michael Многотонный массив без проблем моим вариантом обрабатывается. А ты чем подкрепишь слова? ;) |
Ты вообще представляешь как данные хранятся в компьютере?
Какие операции и как компьютер выполняет при обработке данных?
Что ему нужно проделать, чтобы отсортировать массив и что чтобы просто пройтись по массиву?
Ну если ты очевидного не видишь(разное качество образования сейчас ;) ), то можно и доказательство:
// заполним массив числами, не равными нулю(+ и -)
var arr1 = [];
for (var i=0; i < 500000; i++) {
var x = parseInt((Math.random() - Math.random()) * 1000, 10);
if (x != 0) arr1.push(x);
}
//alert(arr1.join(' | '));
// end заполним массив
var start = new Date();
var res = michaelfind(arr1);
var end = new Date();
alert('Michael Speed: ' + (end.getTime()-start.getTime()) + ' mc');
alert(res);
var start = new Date();
arr1.sort(sortNumber);
var res = arr1[0];
var end = new Date();
alert('Snus Speed: ' + (end.getTime()-start.getTime()) + ' mc');
alert(res);
function sortNumber(a,b){return Math.abs(a)-Math.abs(b);}
function michaelfind(arr) {
var min = Number.MAX_VALUE;
var res = null;
for (var i = 0; i < arr.length; i++) {
var diff = Math.abs(arr[i]);
if (diff < min) {
min = diff;
res = arr[i];
if (min == 0) break;
}
}
return res;
}
У меня результат:
Michael Speed: 19 mc
Snus Speed: 5325 mc
, т.е. разница В 280 раз ;)
Спустя 16 минут, 35 секунд (11.03.2011 - 16:57) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 14:52) |
К тому же, возможно автору понадобится вывести 3 наиболее приближенных числа к 0 |
и что ? Сложно что ли ?... Хранить их 3 как очередь и новое пришедшее выталкивает из результата самое старое. В школе даже такого легкого не помню чтобы задавали когда то ...
Спустя 27 минут, 38 секунд (11.03.2011 - 17:24) Snus написал(а):
Michael
Твоя взяла. Действительно мой вариант плох для полмиллионного массива. Если речь идет о небольших массивах и экономии места, то я бы использовал свой вариант.
Твоя взяла. Действительно мой вариант плох для полмиллионного массива. Если речь идет о небольших массивах и экономии места, то я бы использовал свой вариант.
Спустя 4 минуты, 39 секунд (11.03.2011 - 17:29) Snus написал(а):
Цитата (Michael @ 11.03.2011 - 13:57) |
и что ? laugh.gif Сложно что ли ?... Хранить их 3 как очередь и новое пришедшее выталкивает из результата самое старое. В школе даже такого легкого не помню чтобы задавали когда то ... |
Тут речь не о сложности шла. В твоем варианте изначально не было это учтено.
Спустя 15 часов, 23 минуты, 21 секунда (12.03.2011 - 08:52) Michael написал(а):
Цитата (Snus @ 11.03.2011 - 16:29) | ||
Тут речь не о сложности шла. В твоем варианте изначально не было это учтено. |
Прикалываешься? А зачем это учитывать? Этого не было в задании. Было бы - другое дело. В твоем варианте не учтено например: вывести ближайший по модулю к нулю и его соседей справа/слева в исходном массиве. Да и еще тысячи фантазий.
Речь шла о конкретно этом задании от ТЗ, и двух его решениях
Спустя 14 часов, 8 секунд (12.03.2011 - 22:52) Snus написал(а):
Michael
Из слов автора я понял именно это.
Из слов автора я понял именно это.
Цитата |
необходимо из этого массива вывести самое близкое число к нулю и все другие равные ему по модулю. |