2017-09-23 5 views
-2

en cours grâce à des exercices sur testdome ... actuellement à la recherche à https://www.testdome.com/for-developers/solve-question/9877triés d'augmenter les performances de recherche

Mettre en œuvre la fonction CountNumbers qui accepte un tableau trié d'entiers et compte le nombre d'éléments du tableau qui sont inférieur au paramètre lessThan.

Par exemple, SortedSearch.CountNumbers(new int[] { 1, 3, 5, 7 }, 4) devrait revenir 2 parce qu'il ya deux éléments du tableau moins 4.

Je suis entré:

public class SortedSearch 
{ 
    public static int CountNumbers(int[] sortedArray, int lessThan) 
    { 
     int returnedValued = 0; 

      foreach (int i in sortedArray) 
      { 
       if(i<lessThan) 
       returnedValued += 1; 
      } 

      return returnedValued; 
    } 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(SortedSearch.CountNumbers(new int[] { 1, 3, 5, 7 }, 4)); 
    } 
} 

Je me demandais pourquoi cela a été marqué comme niveau de difficulté difficile et temps prévu 20 min quand je savais que cela ne devrait prendre que quelques-uns. Quoi qu'il en soit, 2 cas sur 4 sont passés. J'échoue sur la limite de temps dépassée et je devine que j'ai besoin de refactoriser pour retourner une recherche plus rapide. Est-ce correct? Et si oui, est-ce que quelqu'un pourrait l'aider?

  Example case: Correct answer 
     Various small arrays: Correct answer 
     Performance test when sortedArray contains lessThan: Time limit exceeded 
     Performance test when sortedArray doesn't contain lessThan: Time limit exceeded
+0

Si vous voulez savoir pourquoi votre code a échoué au test, vous devez demander à la personne qui a créé le test, et non à la communauté Stack Overflow. Une bonne question aurait des informations spécifiques à l'action, telles que le comportement exact attendu et une explication détaillée de ce que vous avez essayé jusqu'ici pour atteindre ce comportement et de ce que vous êtes incapable de comprendre par vous-même. Cette question manque de ces détails, et est susceptible de susciter une grande variété de réponses différentes. Il est trop large et ne contient pas d'énoncé de problème clair. –

+0

Ajoutez 'Using System.Linq;' puis implémentez votre fonction en tant que 'sortedArray.Where (i => i

+0

Aussi, je viens de regarder le site, et il a des indices. Avez-vous lu l'un des conseils? Si non, pourquoi ne pas le faire avant de demander ici? Si oui, quels conseils avez-vous lu, et pourquoi ne vous ont-ils pas aidé à résoudre le problème? ** Astuce: le second indice vous indique _exactement_ ce que vous devez faire pour réussir les tests. ** –

Répondre

1

Vous devriez avoir à briser la boucle foreach, une fois si état obtenir de faux parce que nous savons déjà tableau donné est triée donc il n'y a pas de point de continuer à évaluer d'autres éléments. Veuillez voir ci-dessous l'extrait de code pour référence.

foreach (int i in sortedArray) 
{ 
    if (i < lessThan) 
     returnedValued += 1; 
    else break; 
} 

Veuillez voir ci-dessous la solution qui a passé tous les 4 tests. J'ai utilisé la technique de recherche binaire pour trouver l'élément qui est plus grand que lessThan variable.

public static int CountNumbers(int[] sortedArray, int lessThan) 
{ 
    //Handle all the corner cases 
    int legthOfArray = sortedArray.Length; 
    if (legthOfArray == 0) return 0; 
    if (sortedArray[0] >= lessThan) return 0; 
    if (sortedArray[legthOfArray - 1] < lessThan) return legthOfArray; 
    return FindIndexGreaterOrEqualIndex(sortedArray, legthOfArray, lessThan, legthOfArray/2); 
} 

public static int FindIndexGreaterOrEqualIndex(int[] sortedArray, int lengthOfArray, int lessThan, int currentIndex) 
{ 
    while (true) 
    { 
     bool isCurrentElementLessThan = sortedArray[currentIndex] < lessThan; 
     if (isCurrentElementLessThan) // Traverse Right hand side of binary tree. 
      currentIndex = (int)Math.Ceiling((decimal)(currentIndex + lengthOfArray - 1)/2); 
     else if (sortedArray[currentIndex - 1] < lessThan && !isCurrentElementLessThan) //If array element is not less than and previous element is less than the given element. i.e. our answer so break the loop. 
      break; 
     else // Traverse Left hand side of binary tree. 
      currentIndex = (int)Math.Ceiling((decimal)currentIndex/2); 
    } 
    return currentIndex; 
} 

Jetez un oeil :)

+0

Ce code s'exécute pour toujours, pour l'entrée suivante: Console.WriteLine (CountNumbers (new [] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 5)); – Robie

1

Ils vous attendent à utiliser la méthode Array.BinarySearch pour obtenir 100%.

using System; 

public class SortedSearch 
{ 
    public static int CountNumbers(int[] sortedArray, int lessThan) 
    { 
     if (sortedArray[0] >= lessThan) return 0; 

     int lengthOfArray = sortedArray.Length; 
     if (lengthOfArray == 0) return 0; 
     if (sortedArray[lengthOfArray - 1] < lessThan) return lengthOfArray; 

     int index = Array.BinarySearch(sortedArray, lessThan); 
     if (index < 0) 
      return ~index; 

     return index; 
    } 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(SortedSearch.CountNumbers(new int[] { 1, 3, 5, 7 }, 4)); 
    } 
}