10
votes

Le problème des billets de voyage

Vous recevez une pile de billets de voyage pour diverses transports qui vous emmèneront d'un point A au point B via plusieurs arrêts sur le chemin. Tous les billets sont en panne et que vous ne savez pas où votre voyage commence, ni là où il se termine. Trier les billets dans le bon ordre pour terminer votre voyage. P>

tickets = [
  {from: "Madrid",    to: "Barcelona"},
  {from: "Barcelona", to: "Gerona"},
  {from: "Gerona",    to: "Barcelona"},
  {from: "Barcelona", to: "New York"}
]

11 commentaires

Dois-tu parcourir toutes les villes? Devez-vous utiliser tous les billets?


Oui. En outre, tous les billets doivent être utilisés.


Êtes-vous un agent de voyage paresseux avec trop de billets à portée de main? ;-)


Pas exactement, c'est l'exercice d'entretien d'embauche.


Il y avait quelque chose de similaire dans le concours ICFP de cette année.


@NV, si c'est un entretien d'embauche, êtes-vous autorisé à obtenir de l'aide extérieure? Je veux dire, vous êtes celui qui postule pour le travail, non?


Probablement plus facile fait en triant les billets après le début de l'heure du vol. Bien que cela traitant de tricherie;)


@NV: Pourquoi n'ajoutez-vous pas l'entretien entretien et / ou questions d'entrevue tags?


@IVLAD, @NV: J'ai supprimé ce commentaire sur DUPE.


J'ai effectivement voté pour la fermeture avant de réaliser que ce n'est pas la même question. Je ne peux pas l'annuler.


J'ai voté pour rouvrir. Ce n'est pas la même question.


6 Réponses :


1
votes

N'est-ce pas juste une liste doublement liée? Ajoutez chaque élément à la liste, reliant chacun le cas échéant; Lorsque vous avez terminé, vous aurez deux entrées avec des liens non connectés (un sans rien connecté à son nœud "" à partir de ", un sans connexion à son nœud" "à". Ce sont les points de départ et de fin de la chaîne, et vous les lisez en séquence en commençant par la saisie qui manque de lien "de", et en suivant le lien d'une entrée à la suivante.


2 commentaires

Cela ne tient que si vous êtes assuré que chaque ville est visitée au plus une fois.


VRAI - Ma suggestion est basée sur l'exemple donné, plutôt que d'accueillir d'autres conditions non spécifiées.



1
votes
  1. Créez un graphique dirigé de vos billets.
  2. Trouvez le nœud qui a une valeur intégrée 0
  3. Itérate sur tous les nœuds via des bords graphiques pour créer votre résultat

    Mise à jour: avec les informations ajoutées dans le message d'origine, cette solution ne résout pas le bon problème. Regardez à la place à Ivlad's réponse .


4 commentaires

Quelques questions: pensez-vous à une sorte topologique? Si oui, comment utilisez-vous tous les bords? Sinon, pouvez-vous détailler 3.? Comment ITEZZ-vous?


Est-ce que c'est là-bas The Tech Talk pour "Trouver la ville dans à partir de la liste qui n'apparaît pas dans à la liste , puis commencez à tracer votre itinéraire"? ;-)


@IVLAD J'aurais peut-être pu supposer trop de données de l'échantillon dans le poste, mais s'il y a plus d'un billet partageant le même nœud source, alors oui, il nécessiterait une sorte topologique qui rendrait mon étape 3 beaucoup moins évidente: - )


@scunliffe Presque ... Je construirais probablement le graphique dirigé à l'aide de hachage me donnant une solution O (n) au lieu de O (n ^ 2) pour une boucle imbriquée.



8
votes

Si vous pouvez visiter un nœud (une ville) plus d'une fois, il s'agit du Problème de chemin Eulerian .

ici sont deux algorithmes simples pour la résoudre, en fonction du type de quel type de graphique que vous avez. Vous avez une implémentation récursive à la page 3 ici .


0 commentaires


0
votes

Ce qui suit est un échantillon de la mise en œuvre JavaScript.

var un  =
[
 { from:'c',to:'d'},
 { from:'a',to:'b'},
 { from:'b',to:'c'},
 { from:'z',to:'a'},
 { from:'d',to:'m'},
]

function buildTable( un ){
return un.reduce(function(previousValue, currentValue, currentIndex ){

//build the table.
    previousValue.from[currentValue['from']] = currentValue;
    previousValue.to[currentValue['to']] = currentValue;

//to find start and end.    
    if( !previousValue.from[currentValue['to']] )  previousValue.from[currentValue['to']]= false;
    if(!previousValue.to[currentValue['from']])  previousValue.to[currentValue['from']]= false;

    return previousValue;

},{to:{},from:{}} );


}

function getStart(nodes){
//find start node indx.
    for(var i  in nodes)
    if( !nodes[i] )return i;
}


function print(start,nodes ){


var sorted = [];
//while detecting false from buildTable structure.
    while(start){
        var  node = nodes[start];
        sorted.push(node)
        start = node['to'];
//console.log(start)
    }

return sorted;
}

var sorted = buildTable(un);
console.log(print(getStart(sorted.to),sorted.from));


0 commentaires

-1
votes
    function fullPath(path) {
    let startingPoints = [];
    let endingPoints = [];
    let result = [];

    for (let i = 0; i < path.length; i++) {
        startingPoints.push(path[i].from);
        endingPoints.push(path[i].to);
    }

    for (let i = 0; i < path.length; i++) {
        if (!endingPoints.includes(path[i].from)) {
            result.push(path[i].from);
            break;
        }
    }

    for (let i = 0; i < path.length; i++) {
        if (startingPoints.includes(result[i])) {
            let indexOfPoint = startingPoints.indexOf(result[i]);
            result.push(endingPoints[indexOfPoint]);
        }
    }
    return result;

}

0 commentaires