DEV Community

Altencir Junior
Altencir Junior

Posted on

Resolvendo problemas no HackerRank: Contando divisores de um número inteiro.

Olá, seja bem vindo a mais um Resolvendo problemas no HackerRank: No caso de hoje, vamos pegar alguns números que estão dentro de um parâmetro e após separá-los, os dividir pelo valor anterior e ver se as opções definem um resultado igual a 0, que significaria que eles são divisíveis pelo valor original. Confuso? Vejamos agora uma explicação detalhada e vejamos a resolução.

Find Digits -

Um inteiro d é um divisor de um inteiro n se o resto de(n /d = 0). Dado um número inteiro, para cada dígito que compõe o número inteiro, determinemos se ele é um divisor. Conte o número de divisores que ocorrem dentro do inteiro.

Vejamos alguns exemplos:

  • n = 124, vamos analisar se 1,2 e 4 são divisíveis por 124 cada um em sua vez individual. Todos eles realmente são divisíveis por 124, logo retornaremos 3 pois é o comprimento de valores que são divisíveis.

  • n = 111, todos são os 1s são divisíveis por 111, logo ele retornamos 3 também.

  • n = 10, vamos analisar se 1 e 0 são divisíveis por 10, infelizmente 0 não é divisível por 0 (10/0, não é possível dividir 0), mas 1 é. Logo retornaremos apenas 1, pois é que pode ser retornado.

Vejamos a resolução desse código nesse momento:

function findDigits(n) {

 return[...n + '']
 .map(n => + n)
 .filter(d => n % d === 0).length;
}
Enter fullscreen mode Exit fullscreen mode

No caso acima, a expressão n + '' transforma o valor de n em uma string, para que seja possível percorrer cada um dos seus dígitos com a função map(). O operador (...) spread é utilizado para transformar essa string em um array, de modo que possamos usar a função map() sobre cada caractere individualmente.

Suponhamos que o valor dentro dele fosse 10, no caso acima a expressão n + '' seria como 10 + '', fazendo 10 se tornar uma string( "10"), o fazendo percorrer o `.map, porém como o spread vem antes disso, ele separa individualmente os valors para cada caractere indiviual. Sendoa assim, o 10, se tornaria "[1]" e "[0]".

A função .map retorna cada parâmetro dentro de n ( que no exemplo rápido atrás seria "[1]" e "[0]" que foram desmembrados e separados em arrays próprios. O operador + é utilizado para transformar cada um desses dígitos de volta em um número. Sendo assim, agora seria [1] e [0].

Ao finalizar, fazemos um filter visto que nós queremos pegar o valor deles ali dividido pelo seu valor original de ne ver se ele é igual a 0. A função filter() é usada para filtrar apenas os números que são divisíveis por n sem deixar resto. Esses números são armazenados em um novo array. E depois pegamos o comprimento do valor final que é o que desejamos.

O resultado será:
1 e 2 são divisíveis por 12, logo retornamos 2. Já 1,0,1 e 2, somente 1,1 e 2 são divisíveis por 1012, retornamos 3.

Assim, concluímos mais um Resolvendo problemas no HackerRank: até a próxima.

Top comments (0)