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é
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 lak
-step étape. Donc, ne faites pas un pas sur la première action, et vous manquerezk
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