[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Интересный алгоритм)
Страницы: 1, 2
Zzepish
Вот решил скинуть адлгоритм (поразмять мозги).
Суть: запилить реверс массива. Максимально можно использовать 2 переменные. Массив из чисел
AllesKlar
Задача на зачете 1ый курс Прикладной математики biggrin.gif У меня была

_____________
[продано копирайтерам]
Zzepish
AllesKlar
так она простая) я слышал, что такое задание дают джунам)
chee

$array = range(1, 10);

while ($array) {
$newArray[] = array_pop($array);
}
var_dump($newArray);
die;


Правда исходный массив перестанет существовать :D

Но лучше так:


$array = range(1, 10);

var_dump(array_reverse($array));
die;


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Zzepish
chee
без внутренних функций)))
chee
Zzepish, тогда тупо создать новый массив сделать фор по старому и записать элементы в новый.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Zzepish
chee
новый массив- новая переменная (даже если временная)
AllesKlar
chee
Новый массив? Непозволительное растранжирование памяти. Эээх.. батенька, не жили вы во времена 640кб памяти.
Я сказал, что это было у меня задачей на зачете, но не сказал, что зачет был по ассемблеру.
Там за такое проклинают и ссылают на филфак учиться biggrin.gif

_____________
[продано копирайтерам]
Invis1ble
я не понял, надо создать перевернутую копию исходного массива вместо старого, или сделать отдельный первертыш

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

sergeiss
Цитата (Zzepish @ 4.04.2015 - 23:03)
Суть: запилить реверс массива. Максимально можно использовать 2 переменные. Массив из чисел

Цитата (Zzepish @ 5.04.2015 - 00:23)
без внутренних функций)))

Цитата (Zzepish @ 5.04.2015 - 00:56)
новый массив- новая переменная (даже если временная)

Ну ты уж сразу озвучь все условия :) Кстати. Изначально сказано, что можно использовать 2 переменные. И тут же говоришь, что "новый массив - новая переменная", т.е. типа того, что нельзя использовать новый массив. И где тут логика в твоих утверждениях?

И кстати. Ты ничего не сказал о ключах массива :) То ли они цифровые, то ли это ассоциативный массив. И что в итоге должно быть с ключами. И также не сказал, где именно это массив. А это может быть существенно!!! Потому что в ПХП или в JS массив, по своей сути, объект. А в Си - это просто последовательно взятый набор ячеек памяти. Алгоритмы для Си и для ПХП будут немного отличаться, потому что в Си надо будет сохранить местоположение данных (адреса ячеек), а в ПХП пофиг на это. В целом алгоритмы, конечно, будут схожи. Но в Си будут еще дополнительные телодвижения.

Я вот так предлагаю. Допустим, что изначально у нас данные расположены вот так (это индексы массива, а не величины!!!):

0 1 2 3 4 5


На первой итерации мы берем предпоследний элемент массива и записываем его в промежуточную переменную. После чего перезаписываем данные, получаем их в такой последовательности (цифры - начальные индексы данных):
0 1 2 3 5 4


Далее берем следующий элемент (в данном случае 3-й), пишем его в промежуточную переменную, все следующие за ним (5 и 4) смещаем влево, а затем 3-й пишем в конце:
0 1 2 5 4 3


Ну и так далее, пока не дойдем до начала. К этому моменту у нас массив будет реверсный. Лишних массивов мы при этом создавать не будем. Да, будет много действий - но на их количество ограничений объявлено не было.
В принципе, для ассоциативного массива можно даже ключи сохранить :) Но это будут дополнительные телодвижения. Проще всего будет реализовать алгоритм для массивов, у которых именно цифровые и идущие подряд индексы у элементов.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
brevis
Цитата (Zzepish @ 4.04.2015 - 23:03)
Вот решил скинуть адлгоритм (поразмять мозги).
Суть: запилить реверс массива. Максимально можно использовать 2 переменные. Массив из чисел

Это типа ты сам придумал такое условие? Или просто пересказал "своими словами" бородатую задачку*?

Свернутый текст
*Есть бородатая задачка: развернуть строку/массив. Легенда гласит, что эта задачка должна выявлять уровень мастерства того, кто ее решает. И все по той же легенде уровни такие (для случая, когда элементы массива числа):

1. Плохо -- когда бежим по всему массиву.

2. Нормально -- когда замечаем, что можно бежать только до половины массива:

$array = ...;
$length = count($array);
for ($i=0; $i<$length/2; $i++) {
$tmp = $array[$i];
$array[$i] = $array[$length-$i-1];
$array[$length-$i-1] = $tmp;
}

3. Хорошо -- второй вариант + обмен значений массива делаем через xor, а не через 3ю переменную.
Вот в этом случае если не выносить длину массива в $length -- то как раз подходит под твое уcловие: 1я переменная -- сам массив, 2я -- счетчик $i.


_____________
Чатик в телеге
Zzepish
Invis1ble
надо исходный массив перевернуть.
sergeiss
Цитата
И тут же говоришь, что "новый массив - новая переменная", т.е. типа того, что нельзя использовать новый массив. И где тут логика в твоих утверждениях?

Вот что я имел в виду: есть массив. Нужно его реверснуть без использования доп переменных и внутренних функций.
Т.е.:
$array=Array(1,2,3,4,5,6);
какая-то вакханалия
теперь имеем массив:
$array=Array(6,5,4,3,2,1);
Цитата

И кстати. Ты ничего не сказал о ключах массива smile.gif То ли они цифровые, то ли это ассоциативный массив. И что в итоге должно быть с ключами. И также не сказал, где именно это массив. А это может быть существенно!!! Потому что в ПХП или в JS массив, по своей сути, объект. А в Си - это просто последовательно взятый набор ячеек памяти. Алгоритмы для Си и для ПХП будут немного отличаться, потому что в Си надо будет сохранить местоположение данных (адреса ячеек), а в ПХП пофиг на это. В целом алгоритмы, конечно, будут схожи. Но в Си будут еще дополнительные телодвижения.

Я писала на java и C# данный алгоритм. Почти один в один с php)
Индексы числовые. Массив же, а не хеш-таблицы)
Цитата

На первой итерации мы берем предпоследний элемент массива и записываем его в промежуточную переменную. После чего перезаписываем данные, получаем их в такой последовательности (цифры - начальные индексы данных):

Промежуточная переменная- тоже новая переменная!
brevis
Цитата
Это типа ты сам придумал такое условие? Или просто пересказал "своими словами" бородатую задачку*?

Это одна из простейших задач у нас была в ХНУРЭ на алгоритмах)))
В твоем варианте мы используем промежуточную переменную!))
stump
Что-то похожее на сортировку по убыванию, Но сортируются не значения, а ключи. как для алгоритма можно воспользоваться алгоритмом похожим на быструю сортировку.

_____________
Трус не играет в хокей
SerginhoLD
скучно и неинтересно

Свернутый текст
две переменные, сам массив и счетчик

$ar = array(1, 2, 3, 4, 5, 6);

for ($i = 0; $i < count($ar)/2; $i++)
{
$ar[$i] = $ar[$i] + $ar[count($ar) - 1 - $i];
$ar[count($ar) - 1 - $i] = $ar[$i] - $ar[count($ar) - 1 - $i];
$ar[$i] = $ar[$i] - $ar[count($ar) - 1 - $i];
}

print_r($ar);


и у меня что-то подобное было с циклами на собеседовании когда первый раз работу искал с 0 опыта


_____________
"internet explorer всех правильней отображает страницы" ©
paul85
SerginhoLD, ну и не работает твой код! Собеседование не прошел. ;)
Контр-пример:
Цитата
$ar = array(1, 2, 3, 4, 5, 6, 7);


А вообще очередная чисто академическая задача. Поэтому не очень интересная. Терпеть не могу задачи, оторванные от реалий. =) Где могут встретиться настолько идиотские ограничения в реальной разработке? Правильно, нигде...

Цитата (AllesKlar @ 5.04.2015 - 03:10)
Новый массив? Непозволительное растранжирование памяти.

Да, за такое надо кое-что отрывать. Неважно сколько памяти. Массив-то может быть очень большим. А расточительство есть расточительство!

Свернутый текст
$ar = array(1, 2, 3, 4, 5, 6, 7);

for ($i = 0; $i < (int)(count($ar)/2); $i++)
{
$temp = $ar[$i];
$ar[$i] = $ar[count($ar)-$i-1];
$ar[count($ar)-$i-1] = $temp;
}

print_r($ar);



Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.