Когда я изучаю естественные языки, мне всегда нравилось сравнивать их. Было интересно узнать, например, что английский и немецкий префикс “un-“, латинский префикс “in-” и греческий префикс “ἀ-“, как полагают, происходят от одного и того же протоиндоевропейского префикса “*n-“ . Как (полу) новичок в программировании, я подумал, что было бы также интересно попытаться изучить их в сравнительной манере.
Я буду следовать курсу Udemy Стивена Гридера Учебный лагерь для собеседований по программированию: Алгоритмы + Структуры данных , которые полностью написаны на JavaScript, и решают тот же вопрос на JavaScript, Python и Java, которые являются всего лишь тремя языками, основы которых я знаю.
Первая задача в курсе – перевернуть заданную строку. Стивен представляет три ответа на JavaScript.
1. Простое Решение
язык JavaScript:
function reverse(str) { return str.split('').reverse().join(''); }
Его перевод на Python был бы:
def reverse(str): chars = [char for char in str] chars.reverse() return ''.join(chars)
На идиоматическом языке Python:
def reverse(str): return str[::-1]
Java-эквивалент первого JS-кода будет следующим:
import org.apache.commons.lang3.ArrayUtils; static String reverse(String str) { char[] chars = str.toCharArray(); ArrayUtils.reverse(chars); return String.valueOf(chars); }
Стандартный способ Java для достижения этой цели, по-видимому, заключается в:
static String reverse(String str) { return new StringBuilder(str).reverse().toString(); }
2. Использование цикла For
язык JavaScript:
function reverse(str) { let reversed = ''; for (let char of str) { reversed = char + reversed; } return reversed; }
Питон:
def reverse(str): reversed = '' for char in str: reversed = char + reversed return reversed
Ява:
static String reverse(String str) { StringBuilder reversed = new StringBuilder(); for (char character : str.toCharArray()) { reversed.insert(0, character); } return reversed.toString(); }
что на самом деле очень медленно, когда задается длинная строка, потому что она каждый раз ищет 0-ю позицию.
Этот работает достаточно быстро:
static String reverse(String str) { StringBuilder reversed = new StringBuilder(); for (int i = str.length() - 1; i >= 0; i--) { reversed.append(str.charAt(i)); } return reversed.toString(); }
Это не очень практично или эффективно, но просто для того, чтобы изучить, что предлагают языки.
язык JavaScript:
function reverse(str) { return str.split('').reduce((reversed, char) => char + reversed, ''); }
Питон:
from functools import reduce def reverse(str): return reduce(lambda reversed, char: char + reversed, str)
Ява:
static String reverse6(String str) { return str.chars() .mapToObj(c -> String.valueOf((char) c)) .reduce("", (reversed, chr) -> chr + reversed); }
Я надеюсь, что кто-то найдет это интересным или полезным, и я был бы признателен за любые предложения или комментарии.
Оригинал: “https://dev.to/tommy3/learning-algorighm-with-js-python-and-java-1-string-reversal-33lf”