Создадим функцию reversed1 с аргументом variable , где variable — переменная, хранящая строку, которую мы хотим перевернуть. Так как строка являются неизменяемым объектом, то создадим отдельную, пока что пустую переменную res , которая в будущем будет хранить результат.
def reversed1(variable): res=»
В функцию поместим цикл, который будет «прохаживаться» по каждому из элементов строки. Начнем мы с конца строки, используя положительные индексы, соответственно параметр start функции range — len(variable)-1 . -1 потому, что длина строки всегда на 1 больше, чем индекс последнего ее элемента. Закончить мы должны на первом символе строки, поэтому параметр stop функции range() — -1, поскольку перечисляются числа до значения этого параметра, не включительно. Параметр step — -1, потому что мы считаем в обратном порядке.
def reversed1(variable): res=» for i in range(len(variable)-1,-1,-1): pass
Теперь заполним тело цикла — проведем конкатенацию между старым значением res и элементом строки с индексом i . Таким образом, при каждой итерации цикла мы добавляем по одному символу к результату. После окончания цикла вернем результат.
Swift 5.3 / Задача № 14 / Перевернуть слова в строке
def reversed1(variable): res=» for i in range(len(variable)-1,-1,-1): res+=variable[i] return res n = reversed1(input()) print(n)
2. Использование цикла со списком в результате
Этот способ аналогичен предыдущему, единственное его отличие заключается в типе данных переменной res — здесь она является списком.
Вместо конкатенации можно использовать метод append() , с помощью которого мы добавляем элемент, указанный в качестве аргумента к методу, в конец списка. Итак, мы получили:
def reversed2(variable): res=[] for i in range(len(variable)-1,-1,-1): res.append(variable[i]) return res
Функция пока что возвращает список, состоящий из односимвольных элементов. Если нас это не устраивает, то почему бы не преобразовать список в строку при помощи метода join() ? Сделаем это, добавив конструкцию res=».join(res) .
def reversed1(variable): res=[] for i in range(len(variable)-1,-1,-1): res.append(variable[i]) res=».join(res) return res n = reversed1(input()) print(n)
3. Рекурсия
Третий в нашем обзоре способ — рекурсия, как всегда трудная для понимания. Как всегда создаем функцию, но не спешим помещать туда цикл.
Начну объяснение с конца. Если мы записали в результат все символы кроме первого, то длина оставшейся строки равна единице и, следовательно, ее нужно вернуть. Получаем:
def reversed3(variable): if len(variable) == 1: return variable
Но если длина строки больше одного, то нужно вернуть последний из ее элементов и вызвать эту же функцию, но уже отрезав последний символ. Сделать это мы можем с помощью среза variable[:-1] . Обновим картину:
def reversed3(variable): if len(variable) == 1: return variable else: return variable[-1] + reversed3(variable[:-1])
Использование else: здесь необязательно, так как после возвращения чего-либо этой функцией она завершится. Поэтому конструкцию return variable[-1] + reverse3(variable[:-1]) можно поместить напрямую в тело функции. Конечный вариант решения:
Алгоритм переворота строки (String reverse)
def reversed3(variable): if len(variable) == 1: return variable return variable[-1] + reversed3(variable[:-1]) n = reversed3(input()) print(n)
4. Использование встроенной функции
В Python 3 встроена специальная функция reversed() , в качестве аргумента она принимает список или строку, а возвращает итератор последовательности значений, состоящей из всех элементов аргумента в обратном порядке.
Простыми словами — недостаточно написать res = reversed(variable) , данные нужно преобразовать в нужный тип (в нашем случае — в строку). Сделать мы это можем при помощи метода join() , соединив последовательность через пустую строку. После выполненных действий возвращаем результат. Код:
def reversed4(variable): res=».join(reversed(variable)) return res n = reversed4(input()) print(n)
5. Срез строки
Можете представить способ перевернуть строку, который был бы короче названия функции? А я могу!
Срез строки — вещь прекрасная, но порой пугающая новичков «уплотненным» синтаксисом. Срез содержит три параметра — [start:stop:step], аналогично функции range() . Подробнее о них вы можете прочитать в других статьях на Хабре.
Для способа с использованием срезов не нужно даже создавать функцию, только зря строки и время потратите. Все элементарно — присвоим параметру step значение -1 и пропустим два других параметра, происходит магия — строка переворачивается:
n = input()[::-1] print(n)
Конечно, никакой магии здесь нет, мы просто перебираем символы с шагом -1, то есть в обратном порядке.
Заключение
Первый и второй способы как нельзя лучше подходят, если во время переворота строки нужно ее изменять. При этом они значительно уступают 4 и 5 способам в скорости. Читаются умеренно хорошо, поэтому в некоторых случаях их уместно использовать.
Насчет третьего способа много сказать не могу, поскольку не могу придумать ему применение. Такой способ плохо читается и довольно медленный, поэтому я не рекомендую его использовать.
Четвертый способ довольно быстрый, отлично читается и подходит во многих случаях.
Пятый способ — самый быстрый, хорошо читается, очень краткий (6 символов), поэтому его я считаю наиболее предпочтительным.
Сравнительную таблицу скорости некоторых способов вы можете найти по ссылке — https://python-scripts.com/reversed
Если знаете что-либо еще по этой теме, хотите меня поправить или дать идею — пишите в комментариях, я все прочту и приму к сведению. Удачи!
Источник: habr.com
Перевернуть слова в строке (Си)
Задача: Перевернуть в строке все слова. Например было: «Жили были дед и баба».
Стало: «илиЖ илыб дед и абаб». Решение: В приведенном примере видно, что слова нужно перевернуть, а пробелы между ними (если их несколько) — сохранить. В самом деле, вдруг это применится к исходному коду программы, который выравнен пробелами? Можно было бы решить задачу так: 1. выделить все слова строки в массив;
2. каждое слово перевернуть;
3. сформировать новую строку. Однако, формирование списка слов — задача не простая, ведь надо выделить память для массива — для этого посчитать количество слов. А затем — выделить память для каждого слова. Наконец — заполнить массив словами из строки. То-есть, так или иначе задача формирования списка слов решится на 3 прохода по строке.
Кроме того, у такого подхода возникнет проблема если в изначальной строке между словами записано несколько пробелов и эту особенность надо сохранить. Тогда гужно в еще одном массиве хранить пробелы (проще в виде строк если они могут быть разных типов). Возможно другое решение.
С помощью описанных выше функций можно выделить индексы начала и конца слова строки — start и end . Тогда переворачивать надо часть строки длины end-start, начиная со return c == ‘ ‘; >int is_not_space(char c) < return 0 == is_space(c); >int count_start_if(char* str, int (*pred)(char)) < int count = 0; while (*str != 0) < if (pred(*str)) < count++; str++; >else break; > return count; > int select_word(char *str, int from, int* start, int* lenght) < int spaces_count = count_start_if( from += spaces_count; int word_length = count_start_if( if (word_length *start = from; *lenght = word_length; return 1; > void swap(char* a, char* b) < int tmp = *a; *a = *b; *b = tmp; >void reverse(char* str, int length) < for (int i = 0; i < length/2; ++i) < swap(str[length-i-1]); >> int main() < char str[255]; printf(«enter string: «); scanf(«%255[^n]», str); int cur_index = 0, start, length; while (select_word(str, cur_index, length) == 1) < //printf(«%d — %dn», start, length); reverse( cur_index = start+length; >printf(«string with reversed words: %sn», str); return 0; >
Просмотр 0 веток ответов
- Для ответа в этой теме необходимо авторизоваться.
Наша группа ВКонтакте.
-
Поиск пути в лабиринте (C++) опубликовано Васильев Владимир Сергеевич
2 дня, 10 часов назад
6 дней, 14 часов назад
3 недели, 1 день назад
1 месяц назад
1 месяц, 1 неделя назад
Источник: pro-prof.com
Составить программу которая реверсирует каждое слово строки str
Задачку сделать обратный ход строки на JavaScript очень часто задают на технических собеседованиях. Вас могут попросить написать код для переворачивания строки разными методами, например, без использования встроенных методов или с помощью рекурсии.
Потенциально существуют десятки различных способов реализовать алгоритм. В этой статье будут приведены три интересных способа решения задачи переворачивания строки на JavaScript, которые предложила в своем блоге программист Соня Мойссет.
Итак, задача
Написать алгоритм на JavaScript, который перевернет строку «hello».
Решения
1. Обращаем строку с помощью встроенных функций в JS
В алгоритме мы будем использовать три метода: метод String.prototype.split(), метод Array.prototype.reverse() и метод Array.prototype.join().
- Метод split() разбивает объект string на массив строк путём разделения строки указанной подстрокой.
- Метод reverse() на месте обращает порядок следования элементов массива. Первый элемент массива становится последним, а последний — первым.
- Метод join() объединяет все элементы массива в строку.
Шаг 1. Используем split() метод, чтобы вернуть новый массив.
Шаг 2. Используем reverse() метод, чтобы перевернуть созданный массив.
Шаг 3. Используем join() метод, чтобы соединить все элементы массива в строку.
Шаг 4. Возвращаем перевернутую строку.
function reverseString(str) < var splitString = str.split(«»); // var splitString = «hello».split(«»); // [«h», «e», «l», «l», «o»] var reverseArray = splitString.reverse(); // var reverseArray = [«h», «e», «l», «l», «o»].reverse(); // [«o», «l», «l», «e», «h»] var joinArray = reverseArray.join(«»); // var joinArray = [«o», «l», «l», «e», «h»].join(«»); // «olleh» return joinArray; // «olleh» >reverseString(«hello»);
Три метода вместе:
function reverseString(str) < return str.split(«»).reverse().join(«»); >reverseString(«hello»);
2. Переворачиваем строку с помощью цикла
Шаг 1. Создаем пустую строку, в которой будет размещаться новая строка.
Шаг 2. Создаем цикл FOR.
Шаг 3. Возвращаем перевернутую строку.
function reverseString(str) < var newString = «»; /* Стартовой точкой для цикла будет (str.length — 1), что соответствует последнему символу строки — «o» До тех пор, пока i больше или равно 0, цикл будет работать Мы уменьшаем i после каждой итерации */ for (var i = str.length — 1; i >= 0; i—) < newString += str[i]; // или newString = newString + str[i]; >/* Длина нашей строки «hello» равна пяти Для каждой итерации: i = str.length – 1 и newString = newString + str[i] 1-я: i = 5 — 1 = 4, newString = «» + «o» = «o» 2-я: i = 4 — 1 = 3, newString = «o» + «l» = «ol» 3-я: i = 3 — 1 = 2, newString = «ol» + «l» = «oll» 4-я: i = 2 — 1 = 1, newString = «oll» + «e» = «olle» 5-я: i = 1 — 1 = 0, newString = «olle» + «h» = «olleh» Конец цикла*/ return newString; // «olleh» > reverseString(‘hello’);
3. Переворачиваем строку с помощью рекурсии
Для этого решения мы будем использовать два метода: метод String.prototype.substr() и метод String.prototype.charAt().
Метод substr() возвращает указанное количество символов из строки, начиная с указанной позиции.
«hello».substr(1); // «ello»
Метод charAt() возвращает указанный символ из строки.
«hello».charAt(0); // «h»
Глубина рекурсии равна длине строки. Этот способ решения будет не самым удобным, если строка будет очень длинной.
function reverseString(str) < if (str === «») // Завершение рекурсии return «»; else return reverseString(str.substr(1)) + str.charAt(0); /* Первая часть метода рекурсии. Вы должны помнить, что у вас не будет одного вызова функции, у вас будет несколько вложен ных вызовов. Each call: str === «?» reverseString(str.subst(1)) + str.charAt(0) 1-й вызов – reverseString(«Hello») вернет reverseString(«ello») + «h» 2-й вызов – reverseString(«ello») вернет reverseString(«llo») + «e» 3-й вызов – reverseString(«llo») вернет reverseString(«lo») + «l» 4-й вызов – reverseString(«lo») вернет reverseString(«o») + «l» 5-й вызов – reverseString(«o») вернет reverseString(«») + «o» Вторая часть метода рекурсии. Метод попадает в условие if и наиболее вложенный вызов немедленно возвращается. 5-й вызов вернет reverseString(«») + «o» = «o» 4-й вызов вернет reverseString(«o») + «l» = «o» + «l» 3-й вызов вернет reverseString(«lo») + «l» = «o» + «l» + «l» 2-й вызов вернет reverserString(«llo») + «e» = «o» + «l» + «l» + «e» 1-й вызов вернет reverserString(«ello») + «h» = «o» + «l» + «l» + «e» + «h» */ >reverseString(«hello»);
Заключение
Практиковать написание алгоритмов на языках программирования — полезное занятие для развития логики и отличная практика кодирования. Задачу обратной строки можно решить несколькими способами: пойти по короткому пути или воспользоваться более сложными методами. Надеемся, что статья была вам полезна!
Источник: itlogia.ru