Как написать статический рекурсивный метод в Java? - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу написать коды, используя статический рекурсивный метод в Java, cleanString (String s), который принимает строку букв s и возвращает строку, в которой соседние буквы, которые являются одинаковыми, заменяются одним вхождением этой буквы.Метод чувствителен к регистру.

Например:

cleanString("sensssaatiionnaallll!") -> "sensational!"                             

cleanString("PPProoggggraamm") -> "Program"

cleanString("Lletterriiing") -> "Lletering"

Ответы [ 4 ]

1 голос
/ 10 апреля 2019

Попробуйте это:

public class Main {
    public static void main(String[] args) {
        System.out.println(cleanString("sensssaatiionnaallll!"));
    }
    static String cleanString(String input)
    {
        if(input.length()<1) //To stop infinite recursion
            return input;
        var first = input.charAt(0);
        var count = input.chars().takeWhile(x -> x == first).count();
        return first + cleanString(input.substring((int)count));
    }
}
  • Сначала проверяется, меньше ли длина строки, чем 1. Если это так, верните саму строку (которая пуста) иостановите рекурсию.

  • Далее получите первый символ строки.(например, PPProoggggraamm -> P)

  • Получите количество символов в начале, равное первому символу (3 в случае PPProoggggraamm)

  • Вызовите функцию снова, но на этот раз отрежьте первые n символов из вышеприведенного шага и добавьте первый символ.('P' + cleanString("rooggggraamm"))

0 голосов
/ 10 апреля 2019

Самый короткий рекурсивный код для удаления соседних символов из входной строки.

public class StackOverflow { 

static String cleanString(String input) {
    return input==null || input.length()<=1?input:cleanStringWrapper(input.substring(1),input.substring(0,1));
}

static String cleanStringWrapper(String input, String result) {
  if (input.length() - 1 <= 0) {
    return result+(result.charAt(result.length() - 1)!=input.charAt(0)?input:"");
} else {
    return cleanStringWrapper(input.substring(1), result+(result.charAt(result.length() - 1) != input.charAt(0)?input.charAt(0):""));
}
} 

 public static void main(String[] args) 
 {
     System.out.println(cleanString("OOPS"));
     } 
 }

Выход:

cleanString ("sensssaatiionnaallll!") -> "Сенсационный!"

cleanString ("PPProoggggraamm") -> "Программа"

cleanString ("Lletterriiing") -> "Lletering"

cleanString ("Gooooogle") -> "Gogle"

cleanString ("ABC") -> "ABC"

cleanString ("A") -> "A"

cleanString ("") -> ""

cleanString ( null ) -> null

0 голосов
/ 10 апреля 2019

Он просто генерирует новую строку и исключает повторяющиеся символы.

static String cleanString(String input) {
  if(input == null) return null;

  char lastChar = 0;
  StringBuilder output = new StringBuilder(input.length());
  for (int i=0,n=input.length(); i<n; i++) {
    char c = input.charAt(i);
    if(c != lastChar) {
      lastChar = c;
      output.append(c);
    }
  }

  return output.toString();
}

Рекурсивный метод:

public class Example {
  public static int main(String[] args) {
    String input = "sensssaatiionnaallll";
    String output = cleanString(input, 0);
    System.out.println(output); // print: sensational
    return 0;
  }

  private static String cleanString(String input, int index) {
    if(input == null) return "";
        if(index >= input.length()) return "";

        StringBuilder output = new StringBuilder();

        char current = input.charAt(index);

        int nextIndex = index + 1;
        if(nextIndex >= input.length()) {
            return output.append(current).toString();
        }

        char next = input.charAt(nextIndex);

        if (current != next) {
            output.append(current);
        }

        output.append(cleanString(input, nextIndex));

        return output.toString();
  }
}
0 голосов
/ 10 апреля 2019

Почему вы хотите сделать статический метод для этого?

Я понял, что вы хотите удалить повторяющиеся символы из входной строки.

Вы можете сделать это также под кодом.

StringBuilder sb = new StringBuilder();
str.chars().distinct().forEach(c -> sb.append((char) c));

Если вы хотите, вы можете сделать метод из этих двух строк как функцию в вашем коде.

Надеюсь, это поможет!

...