最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析12306售票算法(java版)

 更新時(shí)間:2016年02月16日 08:59:28   作者:全城熱戀  
這篇文章主要介紹了淺析12306售票算法(java版)的相關(guān)資料,需要的朋友可以參考下

1.以G71列車為例,首先對(duì)車次站臺(tái)進(jìn)行占位編碼(從1開(kāi)始到最后一站遞加)


對(duì)以上占位簡(jiǎn)單描述以下:G71總共18個(gè)站點(diǎn)那么我們的單個(gè)座位的座位標(biāo)識(shí)可以用十八位長(zhǎng)度的二進(jìn)制字符串表示10000000000000000每一位代表一個(gè)站點(diǎn),每天放票前初始化到下面的訂票表中,數(shù)據(jù)如下余票根據(jù)座位標(biāo)識(shí)中的0的個(gè)數(shù)決定最大余票數(shù)量


訂票表中的始發(fā)受限站點(diǎn)和終到受限站點(diǎn)可以靈活搭配(這個(gè)就可以實(shí)現(xiàn)限制站點(diǎn)發(fā)售)

2.查詢余票

如果我們要查詢?nèi)掌跒?016-06-11,始發(fā)站保定東站(3)到韶關(guān)站(15)的G71二等座F座位余票情況只需要執(zhí)行如下sql(該SQL可以實(shí)現(xiàn)選座位和選車廂等功能)

select GUID,車次編碼,車次類型,座位類型,車廂號(hào)碼,座位編碼,座位位置 from 訂票表

where to_number(substring(座位標(biāo)識(shí),3,15))=0

and 發(fā)車日期='2016-06-11'

and 車次編碼='G71'

and substring(始發(fā)受限車站,3,4)=1

and substring(終到受限車站,15,16)=1

and 車票狀態(tài)='待售'

and 車次類型='二等座'

and 座位位置='F'

3.預(yù)定票

3.1根據(jù)第二步中查詢條件獲取一條記錄然后將車票狀態(tài)改為鎖定

3.2待鎖定成功后進(jìn)行支付

3.2支付成功后然后將保定到韶關(guān)的票(000111111111111000這里的始發(fā)站標(biāo)記為0)與原有的票進(jìn)行或運(yùn)算,并將車票狀態(tài)改為待售

100000000000000000 | 000111111111111000 = 100111111111111000 這個(gè)時(shí)候的余票標(biāo)識(shí)即為動(dòng)態(tài)余票

3.3如果指定時(shí)間沒(méi)有支付,那么可以將這條記錄的車票狀態(tài)恢復(fù)為待售

100111111111111000^000111111111111000 = 100000000000000000 這個(gè)時(shí)候的余票及自動(dòng)還原回去了

4.退票

獲得該車次保定到韶關(guān)的票 (000111111111111000)與對(duì)應(yīng)的票進(jìn)行非運(yùn)算,則即可回歸票池子了

以下為相關(guān)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("訂票后的結(jié)果:" + result);
// 如果要取消的話,就進(jìn)行這個(gè)操作
String b = buildTicket(ticketFlag.length(), beginStation,
endStation);
System.out.println("釋放后的結(jié)果:" + releaseTicket(ticketFlag, b));
}
long endTime = System.currentTimeMillis();
System.out.println("耗時(shí):" + (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("預(yù)占票前結(jié)果:" + 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();
}
/**
* 創(chuàng)建區(qū)間占位票
* 
* @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("創(chuàng)建區(qū)間票:" + st.toString());
return st.toString();
}
/**
* 生成訂票后的結(jié)果
* 
* @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;
}
} 

相關(guān)文章

  • Spring?Boot?打包如何將依賴全部打進(jìn)去

    Spring?Boot?打包如何將依賴全部打進(jìn)去

    這篇文章主要介紹了Spring?Boot?打包如何將依賴全部打進(jìn)去,在pom.xml中引入插件,需要在項(xiàng)目的pom.xml文件中,添加?Maven?插件??spring-boot-maven-plugin,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • springboot2.x集成swagger的方法示例

    springboot2.x集成swagger的方法示例

    這篇文章主要介紹了springboot2.x集成swagger的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼

    Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼

    這篇文章主要介紹了Springcloud實(shí)現(xiàn)服務(wù)多版本控制的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java集合總結(jié)

    Java集合總結(jié)

    今天小編就為大家分享一篇關(guān)于Java集合總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java中zip文件壓縮與解壓之ZipInputStream和ZipOutputStream

    Java中zip文件壓縮與解壓之ZipInputStream和ZipOutputStream

    這篇文章主要給大家介紹了關(guān)于Java中zip文件壓縮與解壓之ZipInputStream和ZipOutputStream的相關(guān)資料,ZipInputStream 和 ZipOutputStream 可以用于處理 ZIP文件格式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • SpringBoot整合Redis管道的示例代碼

    SpringBoot整合Redis管道的示例代碼

    本文將結(jié)合實(shí)例代碼,介紹SpringBoot整合Redis管道,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Java?8?中?Function?接口使用方法介紹

    Java?8?中?Function?接口使用方法介紹

    這篇文章主要介紹了Java?8中?Function接口使用方法介紹,Java8中提供了一個(gè)函數(shù)式接口Function,這個(gè)接口表示對(duì)一個(gè)參數(shù)做一些操作然后返回操作之后的值
    2022-06-06
  • Jmeter非GUI模式運(yùn)行分布式測(cè)試

    Jmeter非GUI模式運(yùn)行分布式測(cè)試

    這篇文章主要介紹了Jmeter非GUI模式運(yùn)行分布式測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java打印出所有的水仙花數(shù)的實(shí)現(xiàn)代碼

    Java打印出所有的水仙花數(shù)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java打印出所有的水仙花數(shù)的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-02-02
  • Java源碼解析LinkedList

    Java源碼解析LinkedList

    今天小編就為大家分享一篇關(guān)于Java源碼解析LinkedList,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01

最新評(píng)論

新竹市| 施甸县| 平武县| 阿合奇县| 赤峰市| 吉木乃县| 洛隆县| 图们市| 鄂尔多斯市| 阿克| 曲麻莱县| 丽江市| 藁城市| 芦溪县| 渝北区| 昌平区| 正镶白旗| 三门峡市| 广平县| 岢岚县| 额济纳旗| 枞阳县| 邹平县| 萨迦县| 固阳县| 临汾市| 绥中县| 万荣县| 明星| 永靖县| 杨浦区| 马尔康县| 清水县| 台北市| 类乌齐县| 陆川县| 湘潭县| 界首市| 福州市| 冷水江市| 安徽省|