Java Calculez les marches maximales des escaliers et sautez les escaliers


J'ai récemment obtenu une entrevue pour un poste de stagiaire et l'une des questions était similaire à ceci:

Input: n pour le nombre d'actions, k pour un escalier que vous ne pourriez pas l'étape sur

Question: Jack a n montant des actions où il veut atteindre le nombre maximum de marches mais ne peut pas monter sur le kème escalier. Pour chaque action, Jack peut soit rester à son pas actuel ou sauter i pas s'il est sur son ith action et cela garde aller jusqu'à ce qu'il ait fini son nième action.

Sortie : L'escalier maximum qu'il peut atteindre dans n actions

Il a été testé via Hackerrank (avec l'intervieweur là-bas) et je n'ai passé que 3 cas de test sur 8, le reste expirant

C'était ma solution qui était codée à la volée et je ne pouvais pas l'optimiser et je me demandais s'il y avait une solution beaucoup plus optimisée:

static int maxStep(int n, int k) {
    int result = 0;
    if (n == 0) {
        return result;
    } 
    return maxStepHelper(n,0, k, result);
}

static int maxStepHelper(int n,int i,int k,int result) {
    // At n+1 steps, previous steps' results are recorded and this is mainly used to stop and show previous results
    if (i == n+1) {
        return result;
    }
    int nextStep = i + result;
    if (nextStep == k) {
       return maxStepHelper(n,i+1,k,result);
    } 
    return Math.max(maxStepHelper(n,i+1,k,result),maxStepHelper(n,i+1,k,result+i));
}

Notez que j'ai utilisé une approche récursive qui pourrait ne pas avoir aidé

Author: Andy Turner, 2017-02-18

1 answers

Il n'y a pas besoin de récursivité ou de programmation dynamique ici; c'est juste un peu de mathématiques.

Si vous faites des i pas à chaque tour, vous ferez des (n * (n+1)) / 2 pas. Vous atterrirez sur la k-step étape si k est une solution entière à l'équation:

k = (n * (n+1)) / 2

Réarrangement:

0 = n^2 + n - 2*k

Qui est une équation quadratique dans n:

n = (-1 +/- sqrt(1 + 4*1*2*k)) / 2

Qui n'a une solution entière que si sqrt(1 + 8*k) est un entier impair.

Donc:

  • Si sqrt(1 + 8*k) est un impair entier, vous atterririez sur la k-step étape. Donc, ne faites pas un pas sur la première action, et vous manquerez k par 1. Le nombre maximum d'étapes est (n * (n+1)) / 2 - 1.

    C'est la première action que vous voulez manquer, car 1 est le plus petit nombre d'étapes par lesquelles vous pouvez être court. Si vous manquez la deuxième action, vous serez 2 étapes plus courtes que le maximum, etc.

  • Sinon, il suffit de prendre i étapes sur chaque action, et le nombre maximal d'étapes est (n * (n+1)) / 2

 6
Author: Andy Turner, 2017-02-18 14:29:38