javascript模拟订火车票和退票示例


Posted in Javascript onApril 24, 2014

之前看到有人分析12306后台的逻辑。。火车票的预定和退订不同于普通的购物。
一个难题就是火车票可以分站来卖。比如,一张北京到上海的火车票,沿途可以有很多站,可以北京-济南,济南-南京...等等。如何设计数据模型来存取这些票是一个问题。而不是简单的数量+-1.

其中看到一条思路挺好:用二进制字符串来表示一张火车票,比如,北京到上海共10站,那么一张全程票初始状态表示为:'1111111111';
卖出一张全程票,则该票变为'0000000000';
卖出一张半程票,比如北京-济南三站(第一站-第三站),则票变为'0011111111';
再卖出一张半程票,比如徐州-南京(第6站-第9站),则上一张票变为:'0011100011';

退订票的逻辑就很简单了,我要退一张(徐州-南京)的票,则从票池中找到第一张不能买
(徐州-南京)的票,更改它就OK(买票的逆向).比如,找到了上面的一张票'0011100011',
退票后,此票变为(0011111111);

基本逻辑如上,12306要保证多入口,而同时数据的一致性,需要很高效的逻辑来处理查票,
买票,退票的业务,据说高峰每秒会有20万请求。将票的数据结构保存在内存中。而非数据库。
小而高效的数据结变得很重要。

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());
  }
 };
 //判断一张票是否可以买,通过与或运算来实现。
 //比如:订单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;
 };
 //卖出票的实现,改变二进制字符串,比如'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;
 }
}
//数据模型:票
function Ticket(){
 var self = this;
 //票的初始为全程票
 self.tic = '1111111111';
}
//数据模型:订单
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();
//初始状态,票池有400张全程票
Server._init(400);
Javascript 相关文章推荐
用正则获取指定路径文件的名称
Feb 27 Javascript
javascript 对象定义方法 简单易学
Mar 22 Javascript
真正的JQuery.ajax传递中文参数的解决方法
May 28 Javascript
jQuery调用WebService的实现代码
Jun 19 Javascript
基于jquery的一个拖拽到指定区域内的效果
Sep 21 Javascript
使用非html5实现js板连连看游戏示例代码
Sep 22 Javascript
分享15个大家都熟知的jquery小技巧
Dec 02 Javascript
浅析jQuery Mobile的初始化事件
Dec 03 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
Oct 19 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
JS多个异步请求 按顺序执行next实现解析
Sep 16 Javascript
javascript实现移动端触屏拖拽功能
Jul 29 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 #Javascript
jquery map方法使用示例
Apr 23 #Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
Apr 23 #Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 #Javascript
Jquery实现Div上下移动示例
Apr 23 #Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
Apr 23 #Javascript
JQuery下拉框应用示例介绍
Apr 23 #Javascript
You might like
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
php实现URL加密解密的方法
2016/11/17 PHP
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[08:42]DOTA2每周TOP10 精彩击杀集锦vol.2
2014/06/25 DOTA
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
Python 装饰器使用详解
2017/07/29 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
秋游活动策划方案
2014/02/16 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
您对思维方式了解多少?
2019/12/09 职场文书