1
votes

Une fonction utilisée pour connaître le lieu de départ d'un tour / voyage

Un voyage a la forme [lieu de départ du voyage, lieu de destination du voyage]. Vous recevez les voyages dans un ordre aléatoire. Ecrivez une fonction Javascript pour savoir quel est le point de départ du voyage. L'utilisateur peut également saisir les lieux visités.

Exemple 1: exampleTrips: = [[A, B], [B, C], [C, D]] Le trajet dans cet exemple a commencé à "A".

Exemple 2: exampleTrips: = [[D, E], [F, D], [E, X]] Le voyage dans cet exemple a commencé à "F".

Définition d'un tableau Divisez-le en deux tableaux, a1 et a2 trouver la différence b / w a1 et a2 renvoie l'élément restant de a1

var a = [ ['a', 'b'], ['b', 'c'], ['c', 'd'], ['e', 'a'] ];

var a1 = a.map(function(tuple) {
  return tuple[0];
});

var a2 = a.map(function(tuple) {
  return tuple[1];
});

function difference(a1, a2) {
  var result = [];
  for (var i = 0; i < a1.length; i++) {
    if (a2.indexOf(a1[i]) === -1) {
      result.push(a1[i]);
    }
  }
  return result;
}

console.log(difference(a1, a2));


9 commentaires

Mais vous ne pouvez pas dire si un point est le début ou la fin - il y en a un de chacun et deux du reste. Vous ne pouvez renvoyer que les deux éléments non répétés.


[['a', 'b'], ['b', 'a']] pourrait être une entrée? Pouvez-vous rencontrer le même point plusieurs fois?


Je n'ai besoin que du début signifie un seul élément


Qu'avez-vous fait jusqu'à présent ? Même pseudo code


@adiga j'ai essayé code var a = [['a', 'b'], ['b', 'c'], ['c', 'd'], ['e' , 'une']]; var a1 = a.map (function (tuple) {return tuple [0];}); var a2 = a.map (function (tuple) {return tuple [1];}); console.log (a1, a2); console.log (différence (a1, a2)); différence de fonction (a1, a2) {var result = []; pour (var i = 0; i code


Ceci est illisible dans le commentaire. Veuillez modifier votre question


Veuillez ajouter tout le code pertinent à la question de la prochaine fois pour créer un exemple reproductible minimal . (Vous pouvez également lire Comment créer un extrait de pile exécutable? )


@SyedSaqib - Alors, quel est le problème avec votre réponse? Cela semble être OK (une des nombreuses façons de le faire). Cherchez-vous quelque chose de plus efficace?


@SimpleOne Oui bien sûr


3 Réponses :


1
votes

Commencez par obtenir le début et la fin (uniquement les éléments non répétés), puis déterminez lequel est le premier élément du tableau:

const a = [['a','b'], ['b','c'],['d','a']];
const startEnd = a.reduce((acc, curr) => acc.concat(curr)).filter((e, i, arr) => arr.indexOf(e) == arr.lastIndexOf(e));
const res = a.findIndex(([e]) => startEnd.includes(e));
console.log(res);


3 commentaires

Vous savez quel est le début et la fin car la première entrée de la paire est un point de départ. Donc, dans le cas d'utilisation que vous avez utilisé, la réponse serait «d». Je suppose qu'une fois que vous avez le début et la fin, vous pouvez revérifier pour voir lequel des deux est en position de «départ».


Je vois @SimpleOne. Belle technique. J'ajouterai cela à ma réponse.


Correction de @SimpleOne - à quoi ça ressemble?



0
votes

J'ai une question d'entrevue similaire, voici ma réponse:

const exampleTrips = [ ['Cologne','Berlin'],['Munich','Cologne'],['YourPlace','Munich'] ]
const exampleTrips2 = [ ['A', 'B'], ['B','C'], ['C','D'] ] 


const trips = (array) => {
  if(!array.length) {
    return 'Please input a trip'
  }

  const start = []
  const end = []

  for(const el of array) {
    if(el.length === 2) {
      start.push(el[0])
      end.push(el[1])
    } else {
      return 'Please input a valid start and end trip'
    }
  }

  const place = start.filter((element) => end.indexOf(element) === -1)

   console.log(place[0])
   return place[0]
}



trips(exampleTrips)
trips(exampleTrips2)


0 commentaires

0
votes

La solution dans la question est O (n 2 )

Vous pouvez le faire en O (n) avec une carte de hachage

const findStartingPoint = (trips) => {
    // create a hash map of starting points from all trips
    const tripStarts = trips.reduce((acc, trip) => {
        acc[trip[0]] = false
        return acc
    }, {}) 
    // get ending points from all trips
    const tripEnds = trips.map(trip => trip[1])
    tripEnds.forEach(end => {
        tripStarts[end] = true
    });
    // get tripStarts - tripEnds
    // I'm assuming a journey means continuous trips. This means Every start 
    // except for the journey start should be in trip ends
    let start
    Object.keys(tripStarts).forEach(tripKey => {
        if(tripStarts[tripKey] === false) {
            start = tripKey
        }
    })
    return start ? start : 'You can start your trip anywhere'
}

console.log(findStartingPoint([['Cologne','Berlin'],['Munich','Cologne'],['YourPlace','Munich']]))
console.log(findStartingPoint(
    [
        ['Cologne','Berlin'],
        ['Munich','Cologne'],
        ['YourPlace','Munich']
    ]) === 'YourPlace')

console.log(findStartingPoint(
    [ ['A','B'], ['B','C'], ['C','D'] ]) === 'A')

console.log(findStartingPoint(
    [ ['D','E'], ['F','D'], ['E','X'] ]) === 'F')

console.log(findStartingPoint(
    [ ['A','B'], ['B','C'], ['C','D'], ['D', 'A']]) === 'You can start your trip anywhere')


0 commentaires