国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript模擬訂火車票和退票示例

2019-11-20 20:47:39
字體:
來源:轉載
供稿:網(wǎng)友

之前看到有人分析12306后臺的邏輯。。火車票的預定和退訂不同于普通的購物。
一個難題就是火車票可以分站來賣。比如,一張北京到上海的火車票,沿途可以有很多站,可以北京-濟南,濟南-南京...等等。如何設計數(shù)據(jù)模型來存取這些票是一個問題。而不是簡單的數(shù)量+-1.

其中看到一條思路挺好:用二進制字符串來表示一張火車票,比如,北京到上海共10站,那么一張全程票初始狀態(tài)表示為:'1111111111';
賣出一張全程票,則該票變?yōu)?0000000000';
賣出一張半程票,比如北京-濟南三站(第一站-第三站),則票變?yōu)?0011111111';
再賣出一張半程票,比如徐州-南京(第6站-第9站),則上一張票變?yōu)?'0011100011';

退訂票的邏輯就很簡單了,我要退一張(徐州-南京)的票,則從票池中找到第一張不能買
(徐州-南京)的票,更改它就OK(買票的逆向).比如,找到了上面的一張票'0011100011',
退票后,此票變?yōu)?0011111111);

基本邏輯如上,12306要保證多入口,而同時數(shù)據(jù)的一致性,需要很高效的邏輯來處理查票,
買票,退票的業(yè)務,據(jù)說高峰每秒會有20萬請求。將票的數(shù)據(jù)結構保存在內(nèi)存中。而非數(shù)據(jù)庫。
小而高效的數(shù)據(jù)結變得很重要。

復制代碼 代碼如下:

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<number;i++){
   self.ticketsPool.push(new Ticket());
  }
 };

 //判斷一張票是否可以買,通過與或運算來實現(xiàn)。
 //比如:訂單o為北京-濟南(001111111),某張票為(0000000011)(已賣出北京-南京),那么返回false
 //比如:訂單o為北京-濟南(001111111),某張票為(1111100011)(已賣出徐州-南京),那么返回true
 self.canBuy = function(o,t){
  var _o = ''
  for(j=0; j<o.length; 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;
 };

 //賣出一張票
 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;
 };

 //賣出票的實現(xiàn),改變二進制字符串,比如'111111111'->'001111111';
 self.buy = function(t,o){
  t.tic = (parseInt(t.tic,2) & parseInt(o,2)).toString(2);
  //alert(t.tic);

 };

 //查詢余票
 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;
 }

 //退票,或 運算
 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.length; 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;
 }
}

//數(shù)據(jù)模型:票
function Ticket(){
 var self = this;
 //票的初始為全程票
 self.tic = '1111111111';
}

//數(shù)據(jù)模型:訂單
function Order(from, to){
 var self = this;
 var s = '';
 for(i=0;i<10;i++){
  s += (i>=from && i<to)?0:1;
 }
 return s;
}

//12306后臺
Server = new Server();
//初始狀態(tài),票池有400張全程票
Server._init(400);

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 仁寿县| 无为县| 林州市| 武川县| 巫山县| 张家港市| 沿河| 海安县| 合江县| 浠水县| 遵义县| 类乌齐县| 镇原县| 金溪县| 广平县| 青阳县| 航空| 京山县| 扶余县| 贵阳市| 虎林市| 平陆县| 滨海县| 正阳县| 子洲县| 铜梁县| 清新县| 黄骅市| 霍林郭勒市| 东至县| 玉环县| 东平县| 扶绥县| 巫溪县| 共和县| 临汾市| 绥江县| 龙海市| 松潘县| 于田县| 勐海县|