Рубрики
Без рубрики

Алгоритмы обучения с использованием JS, Python и Java 1: Обращение строк

Попытка следовать курсу алгоритма Udemy Стивена Гридера на трех разных языках. С пометкой “алгоритмы”, “новички”, “обучение”, “java”.

Когда я изучаю естественные языки, мне всегда нравилось сравнивать их. Было интересно узнать, например, что английский и немецкий префикс “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”