淺析12306售票算法(java版)。本站提示廣大學習愛好者:(淺析12306售票算法(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; } }