From ac5ae2fc3631baa05c9d55d11e1e9ca12b6a0f74 Mon Sep 17 00:00:00 2001 From: dtr200 Date: Sat, 26 Jun 2021 16:01:00 +0300 Subject: [PATCH] Homework-2: readme has been updated with task G --- homework-lecture-2/biggest-three.js | 85 +++++++++++++++++++++++++++++ homework-lecture-2/readme.md | 33 ++++++++++- 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 homework-lecture-2/biggest-three.js diff --git a/homework-lecture-2/biggest-three.js b/homework-lecture-2/biggest-three.js new file mode 100644 index 0000000..653a2aa --- /dev/null +++ b/homework-lecture-2/biggest-three.js @@ -0,0 +1,85 @@ +function getBiggestNumbersMult(list){ + list = list.split(' ').map(num => + Number(num)); + + if(list.length === 2){ + return list[0] > list[1] ? + `${list[1]} ${list[0]}` : + `${list[0]} ${list[1]}`; + } + + // Считаю количество минусовых чисел + + let negative = []; + let negativePos = []; + let notNegative = false; + + for(let i = 0; i < list.length; i++){ + if(list[i] < 0){ + negative.push(list[i]); + negativePos.push(i); + } + } + + // Если негативное только одно, тогда убираю из массива. + + if(negative.length === 1){ + list.splice(negativePos[0], 1); + notNegative = true; + } + + /* Ищу наибольшие значения или наименьшие среди минусовых. + В sign приходит false если работаю с минусовыми и + true для плюсовых */ + + const getBigger = (nums, sign) => { + let bigger = nums[0]; + biggerPos = 0; + for(let i = 1; i < nums.length; i++){ + const current = nums[i]; + if( (!sign && current < bigger) || + (sign && current > bigger) ){ + bigger = current; + biggerPos = i; + } + } + return biggerPos; + } + + const firstNegativePos = notNegative ? null : + getBigger(negative, false); + const firstPositivePos = getBigger(list, true); + + const firstNegative = negative[firstNegativePos]; + const firstPositive = list[firstPositivePos]; + + // Удаляю наибольшие значения чтобы не мешались + negative.splice(firstNegativePos, 1); + list.splice(firstPositivePos, 1); + + const secondNegativePos = notNegative ? null : + getBigger(negative, false); + const secondPositivePos = getBigger(list, true); + + const secondNegative = negative[secondNegativePos]; + const secondPositive = list[secondPositivePos]; + + const negativeMult = firstNegative * secondNegative; + const positiveMult = firstPositive * secondPositive; + + const getResult = (first, second) => { + return first > second ? + `${second} ${first}` : + `${first} ${second}`; + } + + let result; + if(negativeMult > positiveMult) + result = getResult(firstNegative, secondNegative); + else + result = getResult(firstPositive, secondPositive); + + return result; +} + +getBiggestNumbersMult('-4 3 -5 2 5'); \ No newline at end of file diff --git a/homework-lecture-2/readme.md b/homework-lecture-2/readme.md index 6d2093f..fa5669d 100644 --- a/homework-lecture-2/readme.md +++ b/homework-lecture-2/readme.md @@ -179,4 +179,35 @@ CONSTANT #### Вывод 0 -### Неполное решение: competition.js (8 тестов) \ No newline at end of file +### Неполное решение: competition.js (8 тестов) + +# G. Наибольшее произведение двух чисел + +Дан список, заполненный произвольными целыми числами. Найдите в этом списке два числа, произведение которых максимально. Выведите эти числа в порядке неубывания. + +Список содержит не менее двух элементов. Числа подобраны так, что ответ однозначен. + +Решение должно иметь сложность O(n), где n - размер списка. + +### Пример 1 +#### Ввод +4 3 5 2 5 + +#### Вывод +5 5 + +### Пример 2 +#### Ввод +-4 3 -5 2 5 + +#### Вывод +-5 -4 + +### Пример 3 +#### Ввод +12288 -10075 29710 15686 -18900 -17715 15992 24431 6220 28403 -23148 18480 -22905 5411 -7602 15560 -26674 11109 -4323 6146 -1523 4312 10666 -15343 -17679 7284 20709 -7103 24305 14334 -12281 17314 26061 25616 17453 16618 -24230 -19788 21172 11339 2202 -22442 -20997 1879 -8773 -8736 5310 -23372 12621 -25596 -28609 -13309 -13 10336 15812 -21193 21576 -1897 -12311 -6988 -25143 -3501 23231 26610 12618 25834 -29140 21011 23427 1494 15215 23013 -15739 8325 5359 -12932 18111 -72 -12509 20116 24390 1920 17487 25536 24934 -6784 -16417 -2222 -16569 -25594 4491 14249 -28927 27281 3297 5998 6259 4577 12415 3779 -8856 3994 19941 11047 2866 -24443 -17299 -9556 12244 6376 -13694 -14647 -22225 21872 7543 -6935 17736 -2464 9390 1133 18202 -9733 -26011 13474 29793 -26628 -26124 27776 970 14277 -23213 775 -9318 29014 -5645 -27027 -21822 -17450 -5 -655 22807 -20981 16310 27605 -18393 914 7323 599 -12503 -28684 5835 -5627 25891 -11801 21243 -21506 22542 -5097 8115 178 10427 25808 10836 -11213 18488 21293 14652 12260 42 21034 8396 -27956 13670 -296 -757 18076 -15597 4135 -25222 -19603 8007 6012 2704 28935 16188 -20848 13502 -11950 -24466 5440 26348 27378 7990 -11523 -26393 + +#### Вывод +29710 29793 + +### Решение: biggest-numbers-mult.js \ No newline at end of file