2025年銀行編程測(cè)試題及答案_第1頁(yè)
2025年銀行編程測(cè)試題及答案_第2頁(yè)
2025年銀行編程測(cè)試題及答案_第3頁(yè)
2025年銀行編程測(cè)試題及答案_第4頁(yè)
2025年銀行編程測(cè)試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2025年銀行編程測(cè)試題及答案一、交易單號(hào)校驗(yàn)(字符串處理與數(shù)學(xué)計(jì)算)題目描述:某銀行交易單號(hào)格式為"BKYYYYMMDDXXXXXXC",其中:"BK"為固定前綴"YYYYMMDD"為交易日期(需驗(yàn)證是否為有效日期)"XXXXXX"為6位順序號(hào)(000000-999999)"C"為校驗(yàn)位,計(jì)算規(guī)則為:取前15位(BK+日期+順序號(hào))中所有數(shù)字的ASCII碼值之和,對(duì)10取模后得到的余數(shù)請(qǐng)編寫函數(shù)驗(yàn)證交易單號(hào)是否合法,需驗(yàn)證格式、日期有效性及校驗(yàn)位。輸入示例:"BK20250229123456"(錯(cuò)誤日期)、"BK20250430987654"(正確日期但校驗(yàn)位錯(cuò)誤)、"BK20250515001234"(正確)輸出示例:False、False、True解題思路:1.長(zhǎng)度校驗(yàn):總長(zhǎng)度應(yīng)為16位(BK占2+日期8+順序號(hào)6+校驗(yàn)位1=17?需修正題目描述,實(shí)際應(yīng)為BK(2)+YYYYMMDD(8)+XXXXXX(6)+C(1)=17位,示例輸入可能筆誤)2.前綴校驗(yàn):前兩位必須是"BK"3.日期校驗(yàn):提取YYYYMMDD部分,驗(yàn)證是否為有效日期(注意閏年判斷,2025年非閏年,2月無29日)4.順序號(hào)校驗(yàn):中間6位必須是數(shù)字且在000000-999999范圍內(nèi)5.校驗(yàn)位計(jì)算:取前15位中的數(shù)字字符(即日期8位+順序號(hào)6位共14位數(shù)字?需明確前15位包含哪些部分:BK(2字符)+日期8(數(shù)字)+順序號(hào)6(數(shù)字)=16字符,前15位應(yīng)為BK(2)+日期8+順序號(hào)5?題目描述可能需調(diào)整,假設(shè)正確格式為BK(2)+日期8+順序號(hào)6+校驗(yàn)位1=17位,前15位為BK(2)+日期8+順序號(hào)5,其中數(shù)字部分為日期8+順序號(hào)5=13位數(shù)字,需重新明確規(guī)則。此處假設(shè)題目正確描述應(yīng)為:前15位包含BK(非數(shù)字)、日期8位(數(shù)字)、順序號(hào)6位(數(shù)字),即總前15位為BK(2)+日期8+順序號(hào)5(共15位),其中數(shù)字部分為日期8+順序號(hào)5=13位,計(jì)算這些數(shù)字的ASCII碼之和。為簡(jiǎn)化,假設(shè)題目中的前15位指除去校驗(yàn)位的前16位中的前15位,可能存在描述歧義,需在答案中明確處理邏輯)代碼實(shí)現(xiàn)(Python):```pythonimportdatetimedefvalidate_trade_no(trade_no:str)->bool:長(zhǎng)度校驗(yàn)iflen(trade_no)!=17:returnFalse前綴校驗(yàn)iftrade_no[:2]!="BK":returnFalse提取各部分date_part=trade_no[2:10]YYYYMMDDseq_part=trade_no[10:16]XXXXXXcheck_bit=trade_no[16]C日期有效性校驗(yàn)try:year=int(date_part[:4])month=int(date_part[4:6])day=int(date_part[6:8])datetime.date(year,month,day)exceptValueError:returnFalse順序號(hào)校驗(yàn)(必須為6位數(shù)字)ifnotseq_part.isdigit()orint(seq_part)<0orint(seq_part)>999999:returnFalse計(jì)算校驗(yàn)位total=0前15位中的數(shù)字字符:日期8位+順序號(hào)6位共14位數(shù)字(BK是字母,不計(jì)入)forcindate_part+seq_part:ifc.isdigit():total+=ord(c)calculated_check=total%10校驗(yàn)位對(duì)比returncheck_bit==str(calculated_check)```二、客戶賬戶流水合并(鏈表操作)題目描述:銀行客戶可能有多個(gè)賬戶(儲(chǔ)蓄卡、信用卡),每個(gè)賬戶的交易流水按時(shí)間順序存儲(chǔ)為有序鏈表(升序,時(shí)間戳為整數(shù))?,F(xiàn)需將n個(gè)有序鏈表合并為一個(gè)按時(shí)間升序排列的鏈表,且合并后需去除重復(fù)時(shí)間戳的記錄(相同時(shí)間戳保留第一個(gè)出現(xiàn)的記錄)。輸入:鏈表列表,每個(gè)鏈表節(jié)點(diǎn)包含時(shí)間戳(timestamp)和交易金額(amount)示例輸入:[1->3->3->5,2->4->5->7,1->2->6]示例輸出:1->2->3->4->5->6->7(每個(gè)節(jié)點(diǎn)保留首次出現(xiàn)的金額)解題思路:1.使用優(yōu)先隊(duì)列(堆)優(yōu)化合并過程,每次取當(dāng)前所有鏈表頭部的最小時(shí)間戳節(jié)點(diǎn)2.維護(hù)前一個(gè)節(jié)點(diǎn)的時(shí)間戳,避免重復(fù)。若當(dāng)前節(jié)點(diǎn)時(shí)間戳等于前一個(gè),則跳過3.注意處理空鏈表的情況代碼實(shí)現(xiàn)(Java,使用自定義鏈表結(jié)構(gòu)):```javaclassListNode{inttimestamp;intamount;ListNodenext;ListNode(intt,inta){timestamp=t;amount=a;}}publicclassMergeAccounts{publicListNodemergeKLists(ListNode[]lists){if(lists==null||lists.length==0)returnnull;//優(yōu)先隊(duì)列按時(shí)間戳排序PriorityQueue<ListNode>heap=newPriorityQueue<>((a,b)->a.timestampb.timestamp);//初始化堆,加入所有非空鏈表頭for(ListNodelist:lists){if(list!=null)heap.offer(list);}ListNodedummy=newListNode(-1,0);ListNodecurr=dummy;intlastTimestamp=Integer.MIN_VALUE;while(!heap.isEmpty()){ListNodenode=heap.poll();//跳過重復(fù)時(shí)間戳if(node.timestamp==lastTimestamp){if(node.next!=null)heap.offer(node.next);continue;}//添加新節(jié)點(diǎn)curr.next=newListNode(node.timestamp,node.amount);curr=curr.next;lastTimestamp=node.timestamp;//將當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)加入堆if(node.next!=null)heap.offer(node.next);}returndummy.next;}}```三、信用卡賬單最優(yōu)分期計(jì)算(動(dòng)態(tài)規(guī)劃)題目描述:某銀行信用卡分期規(guī)則如下:可分3/6/12期,手續(xù)費(fèi)分別為總金額的2%、3.5%、6%允許提前結(jié)清,但已收取手續(xù)費(fèi)不退現(xiàn)需為客戶計(jì)算,將總賬單金額M(整數(shù),單位元)分期,使得總手續(xù)費(fèi)最低。要求輸出最優(yōu)分期方案(各期數(shù)組合)及最低手續(xù)費(fèi)(保留2位小數(shù))輸入示例:M=10000輸出示例:最優(yōu)方案:12期,最低手續(xù)費(fèi)600.00元(若M=15000,可能拆分為12期+3期,總手續(xù)費(fèi)=150006%+0?不,題目是否允許組合分期?需明確規(guī)則。假設(shè)題目允許將賬單拆分為多筆分期(如15000可分12期10000+3期5000),則需動(dòng)態(tài)規(guī)劃計(jì)算不同拆分方式的手續(xù)費(fèi)總和最小值)修正題目:允許將賬單拆分為多筆分期(每筆金額≥1000元,且為100元整數(shù)倍),每筆可選擇3/6/12期。求總手續(xù)費(fèi)最低的拆分方案。輸入示例:M=1600(可分12期1600,手續(xù)費(fèi)96.00;或3期1600,手續(xù)費(fèi)32.00,顯然3期更優(yōu))解題思路:1.定義dp[i]為金額i的最低手續(xù)費(fèi)2.狀態(tài)轉(zhuǎn)移:dp[i]=min(dp[i-j]+cost(j)),其中j為拆分出的一筆分期金額(j≥1000,j≤i,j是100的倍數(shù)),cost(j)為j對(duì)應(yīng)的各期數(shù)最小手續(xù)費(fèi)(3期2%、6期3.5%、12期6%,取最小的2%)3.初始條件:dp[0]=0,i<1000時(shí)無法分期(或題目允許單筆≥1000,故i<1000時(shí)dp[i]=無窮大)代碼實(shí)現(xiàn)(Python):```pythondefmin_installment_fee(M:int)->tuple:每筆分期的最小手續(xù)費(fèi)率(3期2%最低)min_rate=0.02初始化dp數(shù)組,M最大可能到1e5,此處假設(shè)M≤1e5max_m=Mdp=[float('inf')](max_m+1)dp[0]=0記錄拆分路徑prev=[None](max_m+1)foriinrange(1,max_m+1):遍歷可能的拆分金額j(1000≤j≤i,且j是100的倍數(shù))start=max(1000,(i//100)100)ifi%100!=0else1000forjinrange(1000,i+1,100):ifij>=0anddp[ij]+jmin_rate<dp[i]:dp[i]=dp[ij]+jmin_rateprev[i]=j回溯拆分方案ifdp[M]==float('inf'):return("無法分期(金額不足1000元)",0.00)current=Mplan=[]whilecurrent>0:j=prev[current]ifjisNone:breakplan.append(j)current-=jplan.reverse()return(f"最優(yōu)方案:拆分{len(plan)}筆,分別為{plan}元(均選3期)",round(dp[M],2))測(cè)試M=1600print(min_installment_fee(1600))輸出:('最優(yōu)方案:拆分1筆,分別為1600元(均選3期)',32.0)```四、實(shí)時(shí)交易風(fēng)險(xiǎn)監(jiān)控(多線程與隊(duì)列)題目描述:銀行需對(duì)實(shí)時(shí)交易進(jìn)行風(fēng)險(xiǎn)監(jiān)控,要求:接收交易流(每秒約1000筆),通過多線程處理每個(gè)交易需檢查:同一賬戶30秒內(nèi)交易次數(shù)≥5次(觸發(fā)預(yù)警)同一IP地址1分鐘內(nèi)交易金額≥10萬(wàn)元(觸發(fā)預(yù)警)要求線程安全,使用內(nèi)存存儲(chǔ)狀態(tài)(需考慮數(shù)據(jù)過期機(jī)制)解題思路:1.使用線程池處理交易,生產(chǎn)者-消費(fèi)者模式,交易隊(duì)列作為緩沖區(qū)2.維護(hù)兩個(gè)緩存:賬戶交易記錄:key=賬戶ID,value=有序隊(duì)列(存儲(chǔ)時(shí)間戳)IP交易記錄:key=IP,value=(總金額,最早時(shí)間戳)3.定期清理過期數(shù)據(jù)(如每5秒掃描一次,刪除超過30秒/1分鐘的記錄)4.使用ReentrantLock保證緩存操作的線程安全代碼實(shí)現(xiàn)(Java核心部分):```javaimportjava.util.;importjava.util.concurrent.;importjava.util.concurrent.locks.ReentrantLock;classTrade{Stringaccount;Stringip;longtimestamp;//毫秒時(shí)間戳doubleamount;//構(gòu)造方法省略}publicclassRiskMonitor{//交易隊(duì)列,容量10000privateBlockingQueue<Trade>tradeQueue=newArrayBlockingQueue<>(10000);//線程池:4個(gè)工作線程privateExecutorServiceexecutor=Executors.newFixedThreadPool(4);//賬戶交易記錄:賬戶ID->時(shí)間戳隊(duì)列(按時(shí)間排序)privateMap<String,Queue<Long>>accountTrades=newHashMap<>();//IP交易記錄:IP->(總金額,最早時(shí)間戳隊(duì)列)privateMap<String,Pair<Double,Queue<Long>>>ipTrades=newHashMap<>();privateReentrantLocklock=newReentrantLock();publicRiskMonitor(){//啟動(dòng)工作線程for(inti=0;i<4;i++){executor.submit(this::processTrades);}//啟動(dòng)定時(shí)清理任務(wù)ScheduledExecutorServicecleaner=Executors.newSingleThreadScheduledExecutor();cleaner.scheduleAtFixedRate(this::cleanExpiredData,5,5,TimeUnit.SECONDS);}privatevoidprocessTrades(){while(true){try{Tradetrade=tradeQueue.take();//阻塞獲取交易checkAccountRisk(trade);checkIpRisk(trade);}catch(InterruptedExceptione){Thread.currentThread().interrupt();break;}}}privatevoidcheckAccountRisk(Tradet){lock.lock();try{Queue<Long>timestamps=accountTputeIfAbsent(t.account,k->newLinkedList<>());longnow=t.timestamp;//移除30秒前的記錄while(!timestamps.isEmpty()&&nowtimestamps.peek()>30000){timestamps.poll();}timestamps.add(now);if(timestamps.size()>=5){System.out.println("預(yù)警:賬戶"+t.account+"30秒內(nèi)交易超5次");}}finally{lock.unlock();}}privatevoidcheckIpRisk(Tradet){lock.lock();try{Pair<Double,Queue<Long>>ipData=ipTputeIfAbsent(t.ip,k->newPair<>(0.0,newLinkedList<>()));doubletotal=ipData.getKey();Queue<Long>tsQueue=ipData.getValue();longnow=t.timestamp;//移除1分鐘前的記錄,并調(diào)整總金額while(!tsQueue.isEmpty()&&nowtsQueue.peek()>60000){//需記錄每筆金額才能準(zhǔn)確計(jì)算,修正數(shù)據(jù)結(jié)構(gòu)為Queue<Trade>//原設(shè)計(jì)有誤,應(yīng)存儲(chǔ)每筆交易的金額和時(shí)間戳//修正:ipTrades改為Map<String,Queue<Trade>>,存儲(chǔ)該IP的所有未過期交易//重新實(shí)現(xiàn)此部分:Queue<Trade>ipTradesQueue=ipTputeIfAbsent(t.ip,k->newLinkedList<>());while(!ipTradesQueue.isEmpty()&&nowipTradesQueue.peek().timestamp>60000){total-=ipTradesQueue.poll().amount;}total+=t.amount;ipTradesQueue.add(t);if(total>=100000){System.out.println("預(yù)警:IP"+t.ip+"1分鐘內(nèi)交易超10萬(wàn)元");}}}finally{lock.unlock();}}privatevoidcleanExpiredData(){lock.lock();try{longnow=System.currentTimeMillis();//清理賬戶交易記錄accountTrades.values().forEach(q->{while(!q.isEmpty()&&nowq.peek()>30000)q.poll();});//清理IP交易記錄ipTrades.values().forEach(q->{while(!q.isEmpty()&&nowq.peek().timestamp>60000)q.poll();});}finally{lock.unlock();}}publicvoidaddTrade(Tradet){tradeQueue.offer(t);//非阻塞,滿則丟棄或阻塞(根據(jù)業(yè)務(wù)需求調(diào)整)}staticclassPair<T,U>{Tkey;Uvalue;Pair(Tk,Uv){key=k;value=v;}TgetKey(){returnkey;}UgetValue(){returnvalue;}}}```五、客戶資產(chǎn)分布統(tǒng)計(jì)(SQL查詢)題目描述:某銀行數(shù)據(jù)庫(kù)有以下表結(jié)構(gòu):customers(cidINT主鍵,nameVARCHAR,reg_dateDATE)accounts(aidINT主鍵,cidINT外鍵,acc_typeVARCHAR('S'儲(chǔ)蓄/'C'信用/'F'理財(cái)),balanceDECIMAL(18,2))要求編寫SQL查詢:1.統(tǒng)計(jì)每個(gè)客戶類型(按首次開戶類型:客戶的第一個(gè)開戶記錄的acc_type)的客戶數(shù)量及平均資產(chǎn)(總ba

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論