16:01

задача

Life is a life... We are the humans...
задача такая - написать реверс строки без использования буфера... ну то есть аналог strrev... строки недлинные.. и вообще на логику задача...

по идее знаю два решения:

1) использовать в качестве буфера ту же строку, дописывать символы в обратном порядке...

2) в цикле менять посимвольно первый и последний символ, второй и предпоследний и т. п... менять без использования дополнительных это не проблема...



вот вопрос, есть ещё решения, отличные от этих? ))

Комментарии
30.03.2006 в 16:11

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Я в своё время на экзамене писала программку на ассемблере, которая переворачивала связанный список через стек: в первый проход затаскиваем все даные, во второй проход - вытаскиваем (естественно, уже с конца). Оченно изящное решение получилось...
30.03.2006 в 19:53

MrXaK, можно xor`ом, хотя по большому счёту это тоже самое что и менять последний с первым и т.д.



Караидель, стэк ведь тоже будет играть роль буффера насколько я понимаю.
30.03.2006 в 20:58

Life is a life... We are the humans...
Караидель

а можешь реализацию дать? посмотреть интересно...
30.03.2006 в 21:01

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
MrXaK

Ууу... Лень, честно. Да и с работой зашиваюсь. Ну я же описала алгоритм, там дальше понять несложно. Просто тогда на экзамене удачно совпало, что поле данных было ровно слово - удобно было в стек укладывать.
30.03.2006 в 21:12

примитивное не страшно, главное - чтоб надежно (с)
Караидель , MrXaK , TCP_IP , если будет минутка и настроение, просветите, о чем вообще речь. Ну там, с буфером, без буфера...



Раз надо, пускаем, скажем, на родном VB цикл и пишем вторую строковую из первой в обратном порядке. Всего-то и делов.



Dim i as integer

dim stroka1, stroka2 as string



stroka1=***

stroka2=""

for i = len(stroka1) to 1 step -1

stroka2=stroka2 & mid(stroka1,i,1)

next i



И не плюйте сильно, если я тут, ничего не поняв, предлагаю что-то, ни в какие ворота не лезущее :rotate:

30.03.2006 в 21:18

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
sese

Всё верно, но мы обсуждаем максимально красивые решения - оптимальные по времени и затратам памяти или просто нетривиальные.
31.03.2006 в 01:53

Алексей
MrXaK

1) использовать в качестве буфера ту же строку, дописывать символы в обратном порядке...

Это типа в конце строки дописать ее же, но реверсом, а потом скопировать это дело в начало?



2) в цикле менять посимвольно первый и последний символ, второй и предпоследний и т. п... менять без использования дополнительных это не проблема...

Оптимальное решение, в n/2 итераций. Можно использовать xor для обмена содержимого ячеек – так не понадобится даже вспомогательной переменной, но, пожалуй, эффективнее будет воспользоваться одной регистровой.



вот вопрос, есть ещё решения, отличные от этих? ))

При особом желании можно найти много вариантов, но зачем, когда нужно одно оптимальное?



Караидель

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



sese

У тебя stroka2 – это буфер, поэтому твое решение тоже не подходит под требования.