powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перевернуть строку, не пользуясь дополнительным буфером?
26 сообщений из 26, показаны все 2 страниц
Перевернуть строку, не пользуясь дополнительным буфером?
    #33020626
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: Перевернуть строку, не пользуясь дополнительным буфером.
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #33020669
MLeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда-то была функция strrev /string.h/.
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #33020683
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересуют ВАШИ варианты

IMHO, Mon$te®
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #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
Перевернуть строку, не пользуясь дополнительным буфером?
    #33020746
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря вариантик не очень красивый,

ещё?

IMHO, Mon$te®
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #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
Перевернуть строку, не пользуясь дополнительным буфером?
    #33021165
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что значит сия конструкция
s = s^s[l-i];
?

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


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

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

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

тогда тем более лучше указателями, и получиться идеальный вариант :-)
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #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
Перевернуть строку, не пользуясь дополнительным буфером?
    #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
Перевернуть строку, не пользуясь дополнительным буфером?
    #33021499
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как вызывать?
для строки
Код: plaintext
s="Hello big world";

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

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

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

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

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

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

такие задачи не имеют практического применения. Их кстати можно решить через сложение и вычитание. А что толку?
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #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
Перевернуть строку, не пользуясь дополнительным буфером?
    #33021970
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
опечатка - std::iter_swap replace iter_xor_swap
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #33022959
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, за некоторую неточность.

Читал статью, увидел задачу, первая мысль про цикл, а как только прочитал, дальше, понял, что для скорости нужны указатели.
Хотел узнать мысли про цикл, это нормально или плохо :-)
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #33023493
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Мысли про цикл? какие?
"плохо или хорошо" - что конкретно?
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #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
Перевернуть строку, не пользуясь дополнительным буфером?
    #33051904
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
я имел ввиду обмен значениями двух перемнных. использовать для этого операции предназначенные для манипуляциями битами или булевскими величинами - красиво, но на практике - не все типы данных так можно ксорить. ладно не будем загонятся. В конце концов кто-то может вспомнить что подобный вопрос есть и на брайнбенч.
...
Рейтинг: 0 / 0
Перевернуть строку, не пользуясь дополнительным буфером?
    #33062056
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно обменять значения 2х переменных то все таки лучше завести временную (желательно register) и обмен проводить через нее. Как горориться "Неэстетичто, зато дешево, надежно и практично".
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перевернуть строку, не пользуясь дополнительным буфером?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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