Вычитание строк

110
05 марта 2021, 22:30

Вычитанием строк назовем операцию при которой все буквы вычитаемого вычеркиваются из уменьшаемого, а если в уменьшаемом таких букв не было они дописываются в конец уменьшаемого в порядке обхода вычитаемого от 0 индекса к последнему.

Например: abcdef - abcfonpq = deonpq или abcdef - fedcloj = abloj или abcdef - fealobjm = cdlojm

Пример:

Ввод 1: abcdef abcfonpq
Вывод 1: deonpq
Ввод 2: abcdef fedcloj
Вывод 2: abloj

Вроде с точки зрения логики стараюсь все делать правильно, но результат нужный не получается. Подскажите, что в моем коде нужно поправить чтоб заработало?

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    StringBuilder sb = new StringBuilder();
    String text;
    LinkedHashSet<Character> temp = new LinkedHashSet<>();
    text = in.nextLine();
    text = text.replace(" ", "");
    for (int i = 0; i < text.length(); i++) {
        if (temp.add(text.charAt(i))) {
            sb.append(text.charAt(i));
        }
    }
    System.out.println(sb);
}
Answer 1

Надо создать постфикс, в который будет добавляться символ, если он отсутствует в первой строке, если символ в первой строке присутствует, то из обеих строчек этот символ удаляется.

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String[] strings = scanner.nextLine().split(" ");
    StringBuilder postfix = new StringBuilder();
    for (int i = 0; i < strings[1].length();) {
        char c = strings[1].charAt(i);
        if(strings[0].indexOf(c) != -1) {
            strings[0] = strings[0].replaceFirst(""+c,"");
            strings[1] = strings[1].replaceFirst(""+c,"");
        } else {
            postfix.append(c);
            i++;
        }
    }
    strings[0] += postfix;
    System.out.println(strings[0]);
}

Второй вариант цикла for (очевидно, более простой и быстрый):

for (int i = 0; i < strings[1].length(); i++) {
    char c = strings[1].charAt(i);
    if(strings[0].indexOf(c) != -1)
        strings[0] = strings[0].replaceFirst(""+c,"");
    else
        postfix.append(c);
}
Answer 2
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text1 = in.nextLine();
    String text2 = in.nextLine();
    Set<Integer> set = text2.chars()
            .boxed()
            .collect(Collectors.toCollection(LinkedHashSet::new));
    Set<Integer> set1 = text1.chars()
            .filter(ch -> !set.remove(ch))
            .boxed()
            .collect(Collectors.toCollection(LinkedHashSet::new));
    String result = Stream.of(set1,set).flatMap(s->s.stream())
            .mapToInt(Integer::intValue)
            .mapToObj(i->(char)i)
            .map(String::valueOf)
            .collect(Collectors.joining());
    System.out.println(result);
}
Answer 3

Можно сделать просто в лоб как описано в условии:

String s1 = "abba";
String s2 = "abbba";
String result = s1;
for (int i = 0; i < s2.length(); i++) {
    String l = s2.substring(i, i + 1);
    if (s1.contains(l)) {
        s1 = s1.replaceFirst(l, "");
        result = result.replaceFirst(l, "");
    } else {
        result += l;
    }
}
System.out.println(result);

UPD. будет работать и для повторяющихся символов

READ ALSO
Java.Spring. BlockingQueue&lt;&gt;

Java.Spring. BlockingQueue<>

Я в спринге задаю бин

134
Spring WebSocket и SockJS c использованием JWT

Spring WebSocket и SockJS c использованием JWT

Есть приложение на Spring boot 2, в котором пользователи авторизуюца и получают access keyКлиентская часть крутится на nodejs

109
Ad failed to load

Ad failed to load

Не запускается баннер рекламы

94
Node.js Eventloop неожиданное поведение

Node.js Eventloop неожиданное поведение

Если запустить код в консоли то вывод следующий

257