浅析12306售票算法(java版)_java

1.以G71列车为例,首先对车次站台进行占位编码(从1开始到最后一站递加)

对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座位标识可以用十八位长度的二进制字符串表示10000000000000000每一位代表一个站点,每天放票前初始化到下面的订票表中,数据如下余票根据座位标识中的0的个数决定最大余票数量

订票表中的始发受限站点和终到受限站点可以灵活搭配(这个就可以实现限制站点发售)

2.查询余票

如果我们要查询日期为2016-06-11,始发站保定东站(3)到韶关站(15)的G71二等座F座位余票情况只需要执行如下sql(该SQL可以实现选座位和选车厢等功能)

select GUID,车次编码,车次类型,座位类型,车厢号码,座位编码,座位位置 from 订票表

where to_number(substring(座位标识,3,15))=0

and 发车日期='2016-06-11'

and 车次编码='G71'

and substring(始发受限车站,3,4)=1

and substring(终到受限车站,15,16)=1

and 车票状态='待售'

and 车次类型='二等座'

and 座位位置='F'

3.预定票

3.1根据第二步中查询条件获取一条记录然后将车票状态改为锁定

3.2待锁定成功后进行支付

3.2支付成功后然后将保定到韶关的票(000111111111111000这里的始发站标记为0)与原有的票进行或运算,并将车票状态改为待售

100000000000000000 | 000111111111111000 = 100111111111111000 这个时候的余票标识即为动态余票

3.3如果指定时间没有支付,那么可以将这条记录的车票状态恢复为待售

100111111111111000^000111111111111000 = 100000000000000000 这个时候的余票及自动还原回去了

4.退票

获得该车次保定到韶关的票 (000111111111111000)与对应的票进行非运算,则即可回归票池子了

以下为相关java代码

import java.math.BigDecimal;
public class MainTest {
public static void main(String[] args) {
String ticketFlag = "";
int beginStation = ;
int endStation = ;
long beginTime = System.currentTimeMillis();
String result = orderTicket(ticketFlag, beginStation, endStation);
if (result.equals(ticketFlag)) {
System.out.println("订票失败");
} else {
System.out.println("订票后的结果:" + result);
// 如果要取消的话,就进行这个操作
String b = buildTicket(ticketFlag.length(), beginStation,
endStation);
System.out.println("释放后的结果:" + releaseTicket(ticketFlag, b));
}
long endTime = System.currentTimeMillis();
System.out.println("耗时:" + (endTime - beginTime));
}
/**
* 订票
*
* @param ticketFlag
* @param beginStation
* @param endStation
* @return
*/
private static String orderTicket(String ticketFlag, int beginStation,
int endStation) {
String result = "";
if (checkCanTicket(ticketFlag, beginStation, endStation)) {
String b = buildTicket(ticketFlag.length(), beginStation,
endStation);
String currentTicked = toTicket(ticketFlag, b);
System.out.println("预占票前结果:" + ticketFlag);
result = currentTicked;
} else {
result = ticketFlag;
}
;
return result;
}
/**
* 取消已定票
*
* @param ticketFlag
* @param b
* @return
*/
private static String releaseTicket(String ticketFlag, String b) {
StringBuilder tempSt = new StringBuilder("");
int length = ticketFlag.length();
for (int i = ; i < length; i++) {
char tempA = ticketFlag.charAt(i);
char tempB = b.charAt(i);
if (tempA == '' && tempB == '') {
tempSt.append("");
} else {
tempSt.append(tempA);
}
}
return tempSt.toString();
}
/**
* 创建区间占位票
*
* @param length
* @param beginStation
* @param endStation
* @return
*/
private static String buildTicket(int length, int beginStation,
int endStation) {
StringBuilder st = new StringBuilder("");
for (int i = ; i < length; i++) {
if (i >= beginStation && i < endStation) {
st.append("");
} else {
st.append("");
}
}
System.out.println("创建区间票:" + st.toString());
return st.toString();
}
/**
* 生成订票后的结果
*
* @param ticketFlag
* @param b
* @return
*/
private static String toTicket(String ticketFlag, String b) {
StringBuilder tempSt = new StringBuilder("");
int length = ticketFlag.length();
for (int i = ; i < length; i++) {
char tempA = ticketFlag.charAt(i);
char tempB = b.charAt(i);
if (tempA == '' || tempB == '') {
tempSt.append("");
} else {
tempSt.append(tempA);
}
}
return tempSt.toString();
}
/**
* 是否可以订票
*
* @param ticketFlag
* @param beginStation
* @param endStation
* @return
*/
private static boolean checkCanTicket(String ticketFlag, int beginStation,
int endStation) {
boolean result = false;
String tempTicket = ticketFlag.substring(beginStation, endStation);
BigDecimal b = new BigDecimal(tempTicket);
if (b.equals(new BigDecimal(""))) {
result = true;
}
return result;
}
} 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索12306售票
禁忌搜索算法浅析、过载保护算法浅析、12306几点开始售票、12306售票时间、12306售票,以便于您获取更多的相关知识。

时间: 2024-09-27 10:11:28

浅析12306售票算法(java版)_java的相关文章

微信随机生成红包金额算法java版_java

最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发.  public class WxAlgorithm{ /** * @param moneySum 输入总金额 * @param redNum 输入红包数量 */ private static void wxAlgorithm(double moneySum, int redNum) { // 设置最小的金额 double moneyMin = 0.01

Java代码实践12306售票算法(二)_java

周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成Ticket信息 * * @param train * @return */ public static List<Ticket> initTicketList(Train train) { List<Ticket> result = new ArrayList<Ticket&g

Java版本的回文字算法(java版本)_java

废话不多说了,直接给大家贴代码了,具体代码如下所述: package com.gdh.backtext; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class BackText { String text; public BackText() { super(); this.text = null; } public BackText(String text) { supe

初探12306售票算法(一)- 理论(转)

1.以G71列车为例,首先对车次站台进行占位编码(从1开始到最后一站递加)            对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座位标识可以用十八位长度的二进制字符串表示10000000000000000每一位代表一个站点,每天放票前初始化到下面的订票表中,数据如下余票根据座位标识中的0的个数决定最大余票数量  订票表中的始发受限站点和终到受限站点可以灵活搭配(这个就可以实现限制站点发售)  限售渠道十进制 7 代表 1(车站)| 2(互联网)|4(电话)=7 

图书管理系统java版_java

本文的目的就是通过图书管理系统掌握数据库编程技术,能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改.内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出版日期.书号.价格字段.设计一个GUI界面进行书目管理.在该界面上有四个选项卡,分别是查询.插入.删除.修改.点击查询选项卡,出现的界面上有书名.作者.出版社.书号四个文本框,一个按钮和一个只读文本区.文本框内容可以为空,输入相应的查询信息后(例如根据书名查询可以仅输入书名),点击界面上的"查询"按钮,可以在界面下

AJAX省市区三级联动下拉菜单(java版)_java

此小程序的功能主要是采用异步请求方式从数据库中调取省市区信息显示到下拉列表: 代码如下: 建立数据库中的代码和一些配置文件信息就省略了,主要有JavaScript中的代码为: $(document).ready(function(){ $.get("getProvince.do", function(result){ $("#showp").html(result); }); }) var xmlhttp; function mysend(str){ $(docum

详解直接插入排序算法与相关的Java版代码实现_java

直接插入排序 直接插入排序的思路很容易理解,它是这样的: 1.把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的. 2.从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置. 3.重复上述过程直到最后一个元素被插入有序子数组中. 4.排序完成. 示例:思路很简单,但代码并非像冒泡排序那么好写.首先,如何判断合适的位置?大于等于左边.小于等于右边?不行,很多边界条件需要考虑,而且判断次数太多.其次,数组中插入元素,必然需要移动大量元素,如何控制它们的

堆排序算法的讲解及Java版实现_java

堆是数据结构中的一种重要结构,了解了"堆"的概念和操作,可以快速掌握堆排序. 堆的概念堆是一种特殊的完全二叉树(complete binary tree).如果一棵完全二叉树的所有节点的值都不小于其子节点,称之为大根堆(或大顶堆):所有节点的值都不大于其子节点,称之为小根堆(或小顶堆). 在数组(在0号下标存储根节点)中,容易得到下面的式子(这两个式子很重要): 1.下标为i的节点,父节点坐标为(i-1)/2: 2.下标为i的节点,左子节点坐标为2*i+1,右子节点为2*i+2. 堆的

微信支付java版V3验证数据合法性(Deom)_java

1.1 解析微信回调数据 InputStream inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } o