一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 淺析12306售票算法(java版)

淺析12306售票算法(java版)

2020-03-31 11:59全城熱戀 JAVA教程

這篇文章主要介紹了淺析12306售票算法(java版)的相關資料,需要的朋友可以參考下

1.以G71列車為例,首先對車次站臺進行占位編碼(從1開始到最后一站遞加)

淺析12306售票算法(java版)

對以上占位簡單描述以下:G71總共18個站點那么我們的單個座位的座位標識可以用十八位長度的二進制字符串表示10000000000000000每一位代表一個站點,每天放票前初始化到下面的訂票表中,數據如下余票根據座位標識中的0的個數決定最大余票數量

淺析12306售票算法(java版)

訂票表中的始發受限站點和終到受限站點可以靈活搭配(這個就可以實現限制站點發售)

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代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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售票算法(java版)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产日韩视频一区 | 桥本有菜ssni-677在线观看 | 婷婷在线观看香蕉五月天 | 污文啊好棒棒啊好了 | 视频一区二区三区在线观看 | 乌克兰一级毛片 | jizzjizz3d动漫 | 国产精品欧美在线观看 | 接吻吃胸摸下面啪啪教程 | 精品国产欧美精品v | 亚洲第一页综合 | 女主被男主为催奶药h | 欧美亚洲国产精品久久久 | 日韩一级在线观看 | 青青青国产精品国产精品久久久久 | 精品国产一区二区在线观看 | 成人四虎 | 91九色国产porny | 亚洲欧美日韩特级毛片 | 久久机热免费视频 | 欧美成人禁片在线观看俄罗斯 | 国产精品麻豆99久久 | 色综合色狠狠天天久久婷婷基地 | 精品在线小视频 | 日本高清va不卡视频在线观看 | 五月一区二区久久综合天堂 | 亚洲精品久久7777777 | 免费午夜影片在线观看影院 | 国产香蕉一区二区精品视频 | 美女把小内内脱个精光打屁屁 | 狠狠色婷婷狠狠狠亚洲综合 | 每天都要睡男人(nph) | 国产在线伊人 | 亚洲AV久久久久久久无码 | 国产精品久久久久久久久久久威 | 奇米9999 | 男女发生性关系视频 | 久久久免费观看 | 亚洲精品国产乱码AV在线观看 | 午夜福利在线观看6080 | 婷婷色天使在线视频观看 |