Heim  >  Artikel  >  Web-Frontend  >  Javascript-simuliertes Beispiel für die Buchung und Rückerstattung von Bahntickets_Grundkenntnisse

Javascript-simuliertes Beispiel für die Buchung und Rückerstattung von Bahntickets_Grundkenntnisse

WBOY
WBOYOriginal
2016-05-16 16:51:221423Durchsuche

Ich habe schon einmal jemanden gesehen, der die Backend-Logik von 12306 analysiert hat. . Das Buchen und Stornieren von Bahntickets unterscheidet sich vom normalen Einkaufen.
Ein Problem besteht darin, dass Bahntickets an verschiedenen Bahnhöfen verkauft werden können. Beispielsweise kann ein Zugticket von Peking nach Shanghai viele Zwischenstopps auf der Strecke haben, etwa Peking-Jinan, Jinan-Nanjing ... und so weiter. Ein Problem besteht darin, ein Datenmodell für den Zugriff auf diese Tickets zu entwerfen. Anstelle einer einfachen Menge -1.

Ich habe darunter eine gute Idee gesehen: Verwenden Sie eine Binärzeichenfolge, um ein Zugticket darzustellen. Wenn es beispielsweise insgesamt 10 Bahnhöfe von Peking nach Shanghai gibt, lautet der Ausgangszustand eines Vollstreckentickets: „1111111111“. ;
Verkaufen Wenn Sie ein Ticket für die gesamte Fahrt kaufen, wird das Ticket zu „0000000000“; wird zu „0011111111“;
Wenn Sie ein anderes Halbstreckenticket verkaufen, z. B. Xuzhou-Nanjing (Haltestelle 6-9), wird das vorherige Ticket zu „0011100011“;

Die Logik der Stornierung eines Tickets ist sehr einfach. Wenn ich ein Ticket (Xuzhou-Nanjing) erstatten möchte, suche ich mir das erste Ticket aus dem Ticketpool, das nicht gekauft werden kann

(Xuzhou-Nanjing) und ändere es Es ist in Ordnung (die Umkehrung des Kaufs eines Tickets). Wenn Sie beispielsweise das obige Ticket „0011100011“ finden, wird das Ticket nach der Rückerstattung zu (001111111).
Die Grundlogik ist wie oben beschrieben. Es ist eine sehr effiziente Logik erforderlich, um die Ticketprüfung durchzuführen.
Das Geschäft mit dem Kauf und der Rückerstattung von Tickets hat seinen Höhepunkt erreicht von 200.000 Anfragen pro Sekunde. Speichern Sie die Ticketdatenstruktur im Speicher. statt einer Datenbank.

Kleine und effiziente Datenstrukturen werden wichtig.




Code kopieren Der Code lautet wie folgt:if(jQuery){}else{
/ /document.write
}

function Server(){
var self = this;

self.ticketsPool = [];

self._init= function(number){

if(typeof(number) != 'number')

throw ('type error');

for(i=0;i self.ticketsPool.push(new Ticket());
}
};

//Bestimmen Sie, ob ein Ticket über UND- oder ODER-Operationen gekauft werden kann.
//Zum Beispiel: Bestellung o ist Peking-Jinan (001111111) und ein bestimmtes Ticket ist (0000000011) (Peking-Nanjing wurde verkauft), dann Rückgabe von false

//Zum Beispiel: Bestellung o ist Peking -Jinan ( 001111111), ein bestimmtes Ticket ist (1111100011) (verkauft Xuzhou-Nanjing), dann gebe true zurück

self.canBuy = function(o,t){
var _o = ''
for( j =0; j _o = o[j]=='0'?1:0;
var r1 = (parseInt(t.tic,2 ) |. parseInt(o,2)) & parseInt(_o,2);
var r2 = parseInt(_o,2);
return r1 == r2;
};

//Ein Ticket verkaufen
self.pop1Ticket = function(o){
for(i=0;i < self.ticketsPool.length;i ){

if(self. canBuy( o,self.ticketsPool[i])){

self.buy(self.ticketsPool[i],o);
return i;
}
};
return - 1;
};

//Implementierung des Ticketverkaufs, Änderung der Binärzeichenfolge, z. B. '111111111'->'001111111';
self.buy = function(t,o){
t.tic = (parseInt (t.tic,2) & parseInt(o,2)).toString(2);

//alert(t.tic);


};

//Verbleibende Tickets abfragen

self.remainTics = function(o){

var count=0;

for(i=0;i < self.ticketsPool.length;i ){

count = self.canBuy(o,self.ticketsPool[i])?1:0;
};
return count;
}

//Rückerstattung oder Operation
self.refund = function(o){
for(i=0;i < self.ticketsPool.length;i ){

if(!self. canBuy(o,self.ticketsPool[i])){

var _o = ''
for(j=0; j _o = o[j]== '0'?1:0;
}
self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_o,2)).toString(2 );
return i;
}
};

return -1;
}
}

//Datenmodell: Ticket
function Ticket(){
var self = this;

//Das anfängliche Ticket ist ein vollständiges Ticket

self.tic = '1111111111';
}

//Datenmodell: Order
function Order(from, to){
var self = this;

var s = '';

for(i=0;i<10; i ){
s = (i>=from && i }
return s;
}

//12306 Backend
Server = new Server();
//Anfangszustand, der Ticketpool hat 400 volle TicketsServer._init(400);



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn