车票购买最低消费问题java_浅析12306售票算法(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;
}
}
车票购买最低消费问题java_浅析12306售票算法(java版)相关推荐
- java 火车算法_浅析12306售票算法(java版)
1.以G71列车为例,首先对车次站台进行占位编码(从1开始到最后一站递加) 对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座位标识可以用十八位长度的二进制字符串表示100000000 ...
- 票据ticket实现方式java代码_Java代码实践12306售票算法(二)
周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...
- 售票java代码_Java代码实践12306售票算法(二)
周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...
- java按顺序售票方法_java_Java代码实践12306售票算法(二),周五闲来无事,基于上一篇关 - phpStudy...
Java代码实践12306售票算法(二) 周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1 ...
- 售票java代码_初探12306售票算法(二)-java代码实践
周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成Tic ...
- 银联批量结算 java_银联在线 网关支付 (JAVA版)
这一版本的编写是在我上一次博客的基础上写的,有不懂得童鞋可以先看下我的原先在线支付的博客,熟悉下:http://blog.csdn.net/yulei_qq/article/details/45197 ...
- 银联在线支付 java_银联在线 网关支付 (JAVA版)
这一版本的编写是在我上一次博客的基础上写的,有不懂得童鞋可以先看下我的原先在线支付的博客,熟悉下:http://blog.csdn.net/yulei_qq/article/details/45197 ...
- 算法:初探12306售票算法。
以G71列车为例,首先对车次站台进行占位编码(从1开始到最后一站递加) 对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座位标识可以用十八位长度的二进制字符串表示10000000000 ...
- 初探12306售票算法(一)- 理论(转)
1.以G71列车为例,首先对车次站台进行占位编码(从1开始到最后一站递加) 对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座位标识可以用十八位长度的二进制字符串表示100000000 ...
最新文章
- 数据挖掘实战:带你做客户价值分析(附代码)
- MyBatis魔法堂:ResultMap详解
- 转载 干货 | 1400篇机器学习的文章中,这10篇是最棒的!
- Android StageFrightMediaScanner源码解析
- JS----JavaScript中数组扁平化
- vivo手机解锁工具_点燃解锁的多一份激情,vivo NEX双屏版解锁体验报告
- 小透明学弟的华为上岸之路
- Python抓取豆瓣电影详情并提取信息
- 《恋上数据结构第1季》单向循环链表、双向循环链表以及约瑟夫环问题
- 移动通信matlab实现,现代移动通信中的调制技术研究及Matlab实现
- lbp特征的matlab实现
- 必须收藏的文档:IronPython脚本在TIBCO Spotfire中的使用
- 半导体芯片行业的运作模式(IDM/Fabless/Foundry模式)
- 100道c语言经典编程题,C语言经典例题100道
- 《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一2.1 工作流和可视化编程...
- 【python】微信公众号开发
- mysql 难点_数据库技术的重点与难点有什么?
- 东师《中国画技法》离线作业网考
- Jmeter之参数化
- threejs 绘制球体_Three.js基础探寻四——立方体、平面与球体
热门文章
- 全球及中国BT筒夹行业投资建议与前景策略分析报告2022版
- new操作符的实现原理
- hbw-utils - GsonUtils
- q创建群聊显示服务器繁忙是什么意思,一种堵车时聊天群的建立方法及系统
- 对睡眠好的东西,失眠了,就看看这些助眠好物
- 阴阳师服务器维护3月14,3.14日服维护内容非常感谢您一直使用‘阴阳师’。以下日程将...
- 985毕业,土木工程工作两年后转行python,摸爬滚打三年后......
- python 继承多个父类_python多继承及父类出现同名方法的处理
- AURIX TC397 SCU 之 ERU 外部中断
- Linux进程描述符task struct结构体详解--Linux进程的管理与调度(一)