DEV Community

Beatriz Maciel
Beatriz Maciel

Posted on • Edited on

HackerRank #13 | Substring Comparisons | 🇧🇷

Esse problema pede dois inputs: uma string e um int. Essa string terá seus caracteres separados do tamanho do int que receber.

Exemplo de input:

estratosfera
2
Enter fullscreen mode Exit fullscreen mode

Os caracteres serão divididos pelo número de entrada (no caso acima, 2):
es tr at os fe ra

A partir desse input, e sabendo que devemos dividir os caracteres de acordo com o número de entrada, usaremos o .compareTo() para organizar as silabas em ordem alfanumérica.
O output deve ser organizado em dois resultados:

conjunto de caracteres de menor valor
conjunto de caracteres de maior valor
Enter fullscreen mode Exit fullscreen mode

Isso significa que primeiro receberemos a divisão que começa com a primeira letra possível do alfabeto (e, por isso, com o menor valor) e depois receberemos com a última letra possível do alfabeto. A palavra estratosfera seria organizada, pelo método .compareTo(), da seguinte forma:

at es fe os ra tr

Mas, como queremos apenar o conjunto de caracteres de menor e de maior valor, o output será:

at    //.. conjunto de caracteres de menor valor
tr    //.. conjunto de caracteres de maior valor
Enter fullscreen mode Exit fullscreen mode

=======================

O código começa assim:

import java.util.Scanner;

public class Solution {

    public static String getSmallestAndLargest(String s, int k) {
        String smallest = "";
        String largest = "";

        // Complete the function
        // 'smallest' must be the lexicographically smallest substring of length 'k'
        // 'largest' must be the lexicographically largest substring of length 'k'

        return smallest + "\n" + largest;
    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.next();
        int k = scan.nextInt();
        scan.close();

        System.out.println(getSmallestAndLargest(s, k));
    }
}
Enter fullscreen mode Exit fullscreen mode

=========

O passo a passo consiste em:

  • Declarar que as variáveis smallest e largest começam em 0 e tem o tamanho de caracteres declarados pelo input k. Essa declaração é só para começar, porque será substituída posteriormente. Por isso as duas são iguais.
  • Declarar um int que começa em 0
  • Fazer um while que some a variável i com k (número de entrada no input)
  • Enquanto essa soma for menor ou do mesmo tamanho da string, fazer uma substring que comece em i (a partir de 0) e termine no número de input k + i. Se for menor do que 0, significa que o conjunto de caracteres é menor alfanumericamente.
  • Se o conjunto de caracteres for menor alfanumericamente, isso significa que vamos substituir o valor de smallest.
  • Se o conjunto de caracteres não for menor (e, portanto, não retornar um número negativo), vai para o segundo if. Se, na comparação, o conjunto de caracteres for maior do que o valor inicial declarado no largest, este conjunto substitui o valor anterior.
  • Por fim, somamos mais uma posição (i++) para dar cabo à iteração e ir comparando todos os conjuntos de caracteres até que termine as possibilidades de acordo com o tamanho (length) da String de input (s).

=========

Solução

        String smallest = s.substring(0,k);
        String largest = s.substring(0,k);
        int i = 0;

        while (i+k <= s.length()) {
            if(s.substring(i,i+k).compareTo(smallest) < 0 ) {
                smallest = s.substring(i,i+k);
            } else if (s.substring(i,i+k).compareTo(largest) > 0) {
                largest = s.substring(i,i+k);
            }
            i++;
        }
Enter fullscreen mode Exit fullscreen mode

=========

Referências

============

Essa publicação faz parte de uma série de exercícios resolvidos em Java no HackerRank. Acesse a série completa:

Top comments (0)

Great read:

Is it Time to go Back to the Monolith?

History repeats itself. Everything old is new again and I’ve been around long enough to see ideas discarded, rediscovered and return triumphantly to overtake the fad. In recent years SQL has made a tremendous comeback from the dead. We love relational databases all over again. I think the Monolith will have its space odyssey moment again. Microservices and serverless are trends pushed by the cloud vendors, designed to sell us more cloud computing resources.

Microservices make very little sense financially for most use cases. Yes, they can ramp down. But when they scale up, they pay the costs in dividends. The increased observability costs alone line the pockets of the “big cloud” vendors.