J'ai besoin d'écrire une méthode appelée MakeSequence qui prend en un seul paramètre entier N et produit et renvoie une séquence String. Par exemple, MakeSequence (5) renverrait une chaîne composée de «...

0
groovy covalent 14 mars 2021 à 22:37

5 réponses

Meilleure réponse

En utilisant StringBuilder pour concaténer une chaîne très rapidement.

Le problème que vous n'avez pas concaténé la chaîne correctement

    public static void main(String[] args) {
        String result = makeSequence(new StringBuilder(), 5);
        System.out.println(result);
    }

    public static String makeSequence(StringBuilder builder, int N) {
        if (N > 0) {
            for (int k = 0; k < N; k++) {
                builder.append(N);
            }
            return makeSequence(builder, N - 1);
        }
        return builder.toString();
    }

, output

555554444333221
0
sc0der 14 mars 2021 à 19:46

Une autre solution:

public static String MakeSequence(int N) {
      if(N < 1) return "";
      StringBuilder builder = new StringBuilder();
      for (int i = N; i > 0 ; i--) {
          builder.append(String.valueOf(i).repeat(i));
      }

      return builder.toString();
}
0
oktaykcr 14 mars 2021 à 19:54

En plus de l'autre réponse .... Si vous n'avez pas besoin de la récursivité, vous pouvez également le faire en boucle. (répétition java11)

private static String callMe(int counter) {
    StringBuilder result = new StringBuilder();
    for(int y = counter ; y > 0 ;y--){
        result.append(String.valueOf(y).repeat(y));
    }
    return result.toString();
}
0
pL4Gu33 14 mars 2021 à 19:55

Que diriez-vous de IntStream#iterate pour créer une séquence d'entiers de 5 à 1, puis répétez la chaîne en utilisant String#repeat à partir de Java 11 et enfin collecter en utilisant Collectors.joining()?

String string = IntStream.iterate(5, i -> i > 0, i -> i- 1)          // 5 to 0 (excl.)
                         .mapToObj(i -> String.valueOf(i).repeat(i)) // repeat i i-times
                         .collect(Collectors.joining());             // concatenate
System.out.println(string);             // 555554444333221
0
Nikolas Charalambidis 14 mars 2021 à 20:32

Vous avez déjà un certain nombre de bonnes réponses ici, mais juste pour le plaisir, voici une autre approche purement récursive. Pas efficace évidemment, mais assez joli.

public static String makeSequence(int n)
{
    return makeSequence(new StringBuilder(), n, n);
}

private static String makeSequence(StringBuilder b, int n, int m)
{
    if (m > 0) 
        return makeSequence(b.append(n), n, m-1);
    
    if (n > 0) 
        return makeSequence(b, n-1, n-1);
    
    return b.toString();
}
0
RaffleBuffle 14 mars 2021 à 20:55