Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перевернуть строку, не пользуясь дополнительным буфером? / 25 сообщений из 26, страница 1 из 2
18.04.2005, 11:44
    #33020626
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Задача: Перевернуть строку, не пользуясь дополнительным буфером.
...
Рейтинг: 0 / 0
18.04.2005, 12:00
    #33020669
MLeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Когда-то была функция strrev /string.h/.
...
Рейтинг: 0 / 0
18.04.2005, 12:04
    #33020683
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Интересуют ВАШИ варианты

IMHO, Mon$te®
...
Рейтинг: 0 / 0
18.04.2005, 12:24
    #33020738
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Код: plaintext
1.
2.
3.
4.
5.
6.
l = strlen(s);
for (i =  0 ; i < l/ 2 ; i++) {
   s[l+ 1 ] = s[i];
   s[i] = s[l-i];
   s[l-i] = s[l+ 1 ];
} 
s[l+ 1 ]= 0 ;
...
Рейтинг: 0 / 0
18.04.2005, 12:26
    #33020746
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Честно говоря вариантик не очень красивый,

ещё?

IMHO, Mon$te®
...
Рейтинг: 0 / 0
18.04.2005, 13:00
    #33020874
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Код: plaintext
1.
2.
3.
4.
5.
l = strlen(s);
for (i =  0 ; i < l/ 2 ; i++) {
   s[i]   = s[i]^s[l-i];
   s[l-i] = s[i]^s[l-i];
   s[i]   = s[i]^s[l-i];
}
...
Рейтинг: 0 / 0
18.04.2005, 14:26
    #33021165
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
а что значит сия конструкция
s = s^s[l-i];
?

а указателями не лучше?
...
Рейтинг: 0 / 0
18.04.2005, 14:35
    #33021202
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
автора что значит сия конструкция
s = s^s[l-i];
?


^ означает побитное исключающее или.

автора указателями не лучше?

Не знаю, не думал на эту тему.
...
Рейтинг: 0 / 0
18.04.2005, 14:40
    #33021218
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
XOR - круто придумано,

тогда тем более лучше указателями, и получиться идеальный вариант :-)
...
Рейтинг: 0 / 0
18.04.2005, 15:40
    #33021442
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
l=s;
r=s[len(s)];

while(l<=r) 
 {
  tmp=*l;
  *l=*r;
  *r=tmp;
  l++;
  r--;
 }
а так заработает?
а так красивее?

IMHO, Mon$te®
...
Рейтинг: 0 / 0
18.04.2005, 15:55
    #33021480
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Код: plaintext
1.
2.
3.
4.
5.
void reverse(char* First, char* Last)
{	
  for (; First < Last; ++First)
	std::iter_swap(First, --Last);
}

и в чем сложность?
...
Рейтинг: 0 / 0
18.04.2005, 16:01
    #33021499
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
а как вызывать?
для строки
Код: plaintext
s="Hello big world";

а такого условия достаточно?
Код: plaintext
First < Last

IMHO, Mon$te®
...
Рейтинг: 0 / 0
18.04.2005, 17:14
    #33021693
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
for(char *start, *stop = str+strlen(str); start<stop; start++, stop--)
std::swap(*start,*stop);
...
Рейтинг: 0 / 0
18.04.2005, 17:17
    #33021699
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Исправил
for(char *start=str, *stop = str+strlen(str); start<stop; start++, stop--)
std::swap(*start,*stop);
...
Рейтинг: 0 / 0
18.04.2005, 17:19
    #33021706
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Мне честно говоря было интерестно, какой вариант приходит сразу на ум: с указателями или []ми.

напишите, плиз

IMHO, Mon$te®
...
Рейтинг: 0 / 0
18.04.2005, 18:00
    #33021790
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
4d_monster
а такого условия достаточно?
First < Last

поверь мне достаточно - указатели двигаются навстречу друг другу. Алгоритм работает стопудово для всех видов строк. ТОлько для дурацких сишных строк указатель last надо ставить не на НОЛЬ, а на последний символ.
...
Рейтинг: 0 / 0
18.04.2005, 18:02
    #33021794
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Извиняюсь ошибся - попправлю сам себя. указатель ласт для сишных строк может стоять на НУЛЕ. Потому что у меня у Last префиксный декремент.
...
Рейтинг: 0 / 0
18.04.2005, 18:41
    #33021890
SnowMan2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Насколько я понял вопрос, надо без дополнительной переменой типа tmp и без стандартных функций типа swap.

Задача из этой же серии:
Есть две переменные a и b типа int, поменять значения местами, без третьей переменной, без функций, испоьзуя только четыре арифметических операции.
...
Рейтинг: 0 / 0
18.04.2005, 19:06
    #33021949
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
A = A xor B
B = A xor B
A = A xor B

такие задачи не имеют практического применения. Их кстати можно решить через сложение и вычитание. А что толку?
...
Рейтинг: 0 / 0
18.04.2005, 19:14
    #33021968
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
И потом кто тебе мешает вместо std::iter_swap написать такое
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void iter_xor_swap( char* lhs, char* rhs )
{
 *lhs ^= *rhs;
 *rhs ^= *lhs;
 *lhs ^= *rhs;
}

void reverse(char* First, char* Last)
{
  for (; First < Last; ++First) std::iter_swap(First, --Last);
}

только опять же что толку. Если ты не объявляешь временные переменные, то это не значит что за тебя это не делает компилер:
1) передача параметров
2) разыменовывание

нет я конечно понимаю, что типа сбор задачек для приема на работу или наоборот поиск ответов для задач которые задали при приеме на работу. Это да. Но мое ИМХО задание таких теоретических задач ничего не развивает кроме решения этих теоретических задач.

Если уж принимаешь на работу, то задавай что-то из практики ради который ты будешь брать человека на работу. Если там с файлами или винапи будет работать - пусть напишет команду dir. Если это инженерные задачи связанные с математикой - ну дай задачку на численный метод. И т.д. и т.п.

PS: извините за занудство 8-)
...
Рейтинг: 0 / 0
18.04.2005, 19:15
    #33021970
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
опечатка - std::iter_swap replace iter_xor_swap
...
Рейтинг: 0 / 0
19.04.2005, 13:17
    #33022959
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Извините, за некоторую неточность.

Читал статью, увидел задачу, первая мысль про цикл, а как только прочитал, дальше, понял, что для скорости нужны указатели.
Хотел узнать мысли про цикл, это нормально или плохо :-)
...
Рейтинг: 0 / 0
19.04.2005, 15:34
    #33023493
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
Мысли про цикл? какие?
"плохо или хорошо" - что конкретно?
...
Рейтинг: 0 / 0
06.05.2005, 06:01
    #33051778
Dubrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
dwl
A = A xor B
B = A xor B
A = A xor B

такие задачи не имеют практического применения. Их кстати можно решить через сложение и вычитание. А что толку?


Почему не имеют?
Постейший вопрос. Как заменить биты из одного регистра битами из другого?
Ответ:
Код: plaintext
1.
2.
3.
4.
 
  xor  dst //Инвертируем все биты
  and mask //Устанавливаем нужный бит
  xor  dst //Инвертируем все биты
А теперь представте как это бы выглядело по правилам (если нужно изменить битов 6-7). :-)
P.S. Не обижайтесь что говорю прописные истины, но кто-то может этого и не знать.
...
Рейтинг: 0 / 0
06.05.2005, 09:16
    #33051904
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевернуть строку, не пользуясь дополнительным буфером?
я имел ввиду обмен значениями двух перемнных. использовать для этого операции предназначенные для манипуляциями битами или булевскими величинами - красиво, но на практике - не все типы данных так можно ксорить. ладно не будем загонятся. В конце концов кто-то может вспомнить что подобный вопрос есть и на брайнбенч.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перевернуть строку, не пользуясь дополнительным буфером? / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]