㈠ 用java如何判斷撲克牌同花順
撲克牌有兩個屬性,花色和牌面大小,可以分別比較花色和牌面大小是否遞增或遞減來確定是不是同花順.但是由於撲克牌會有JQKA,所以牌面大小最好以數組或者字元串的方式實現,通過比較下標來比較大小,以下是大概的代碼
publicclassPuKe{
privateStringcolor;
privateStringnum;
publicStringgetColor(){
returncolor;
}
publicvoidsetColor(Stringcolor){
this.color=color;
}
publicStringgetNum(){
returnnum;
}
publicvoidsetNum(Stringnum){
this.num=num;
}
publicPuKe(Stringcolor,Stringnum){
super();
this.color=color;
this.num=num;
}
publicstaticvoidmain(String[]args){
List<PuKe>card=newArrayList<PuKe>();
card.add(newPuKe("black","2"));
card.add(newPuKe("black","3"));
card.add(newPuKe("black","4"));
card.add(newPuKe("black","5"));
card.add(newPuKe("black","6"));
//這里因為10是兩位數且牌面裡面用不到1,所以直接用1代替10
Stringcheck="234567891JQKA";
booleanflage=true;
//自定義比較器,用num在check里的下標大小作為比較依據排序
Collections.sort(card,newComparator<Object>(){
@Override
publicintcompare(Objecto1,Objecto2){
PuKeer1=(PuKe)o1;
PuKeer2=(PuKe)o2;
Integerorg1=(int)(er1.getNum()==null?0.0:check.indexOf(er1.getNum()));
Integerorg2=(int)(er1.getNum()==null?0.0:check.indexOf(er2.getNum()));
returnorg1.compareTo(org2);
}
});
for(inti=0;i<card.size()-1;i++){
//遍歷所有的牌,如果顏色不一樣直接跳出循環,不是同花順
if(!card.get(i).getColor().equals(card.get(i+1).getColor())){
flage=false;
break;
}
//如果上一張減去下一張的差值不是1,說明牌面不是順子,也不是同花順,跳出循環
if((int)check.indexOf(card.get(i+1).getNum())-(int)check.indexOf(card.get(i).getNum())!=1){
flage=false;
break;
}
}
if(flage){
System.out.println("牌面是同花順");
}else{
System.out.println("牌面不是同花順");
}
}
}
不過這種方法唯一不好的地方是check中不能直接用10,將來展示的時候需要判定,展示的是1時直接改成10.
其實實現方法很多,我這么寫是因為最近在復習,這么寫用到的知識點相對會多一點.
㈡ php中高級面試題 – 第二天
一、寫一段代碼判斷單向鏈表中有沒有形成環,如果形成環,請找出環的入口處,即 P 點
二、從撲克牌中隨機抽出 5 張牌,判斷是不是一個順子,即這5張牌是連續的
這個問題有個關鍵點,撲克牌,1-13 不能再多了。這就很簡單了。用PHP來做,定義一個數組分別存著1到13, 拿出一個,置空一個,最後看下這五個置空的 是不是連續的。這種情況不考慮抽出的順序。
三、說一下 PHP 的(內存)垃圾回收機制
每一個變數對應一個 zval 數據結構,在該結構內還有一個 val 結構體,該結構體內有一個引用計數(php7 而言,對於 php5,這個引用計數是保存在 zval 結構中的),標識該對象的引用數,當對象的引用計數為 0 時代表這個對象可被回收。
對象的 refcount 減少的時機:修改變數、函數返回(釋放局部變數)、unset 變數
對於數組和對象而言,可能存在變數中的成員引用變數本身的情況,也就是循環引用,這樣會造成這個變數永遠不會被內存回收,而成為垃圾。
PHP 里對於這種情況給出了垃圾回收機制:如果數組、對象的引用計數減少而且不為零,則認為他們可能是垃圾,把他們放到垃圾收集器里。等垃圾收集器到了一定的數量之後,進行垃圾處理:對所有可能的垃圾 refcount 減 1,如果為 1,說明是垃圾,則進行內存回收;如果不為 1,說明還有其他變數在使用,refcount 重新加 1;這種對象復用以及垃圾回收機制在其他語言中也有體現:redis 中也使用了引用計數表示每個對象的引用數量。
四、簡述一下PHP簡訊驗證碼如何防刷?
1、時間限制:60 秒後才能再次發送
從發送驗證碼開始,前端(客戶端)會進行一個 60 秒的倒數,在這一分鍾之內,用戶是無法提交多次發送信息的請求的。這種方法雖然使用得比較普遍,但是卻不是非常有用,技術稍微好點的人完全可以繞過這個限制,直接發送簡訊驗證碼。
2、手機號限制:同一個手機號,24 小時之內不能夠超過 5 條
對使用同一個手機號碼進行注冊或者其他發送簡訊驗證碼的操作的時候,系統可以對這個手機號碼進行限制,例如,24 小時只能發送 5 條簡訊驗證碼,超出限制則進行報錯(如:系統繁忙,請稍後再試)。然而,這也只能夠避免人工手動刷簡訊而已,對於批量使用不同手機號碼來刷簡訊的機器,這種方法也是無可奈何的。
3、簡訊驗證碼限制:30 分鍾之內發送同一個驗證碼
網上還有一種方法說:30 分鍾之內,所有的請求,所發送的簡訊驗證碼都是同一個驗證碼。第一次請求簡訊介面,然後緩存簡訊驗證碼結果,30 分鍾之內再次請求,則直接返回緩存的內容。對於這種方式,不是很清楚簡訊介面商會不會對發送緩存信息收取費用,如果有興趣可以了解了解。
4、前後端校驗:提交 Token 參數校驗
這種方式比較少人說到,個人覺得可以這種方法值得一試。前端(客戶端)在請求發送簡訊的時候,同時向服務端提交一個 Token 參數,服務端對這個 Token 參數進行校驗,校驗通過之後,再向請求發送簡訊的介面向用戶手機發送簡訊。
5、唯一性限制:微信產品,限制同一個微信 ID 用戶的請求數量
如果是微信的產品的話,可以通過微信 ID 來進行識別,然後對同一個微信 ID 的用戶限制,24 小時之內最多隻能夠發送一定量的簡訊。
6、產品流程限制:分步驟進行
例如注冊的簡訊驗證碼使用場景,我們將注冊的步驟分成 2 步,用戶在輸入手機號碼並設置了密碼之後,下一步才進入驗證碼的驗證步驟。
7、圖形驗證碼限制:圖形驗證通過後再請求介面
用戶輸入圖形驗證碼並通過之後,再請求簡訊介面獲取驗證碼。為了有更好的用戶體驗,也可以設計成:一開始不需要輸入圖形驗證碼,在操作達到一定量之後,才需要輸入圖形驗證碼。具體情況請根據具體場景來進行設計。
8、IP 及 Cookie 限制:限制相同的 IP/Cookie 信息最大數量
使用 Cookie 或者 IP,能夠簡單識別同一個用戶,然後對相同的用戶進行限制(如:24 小時內最多隻能夠發送 20 條簡訊)。然而,Cookie 能夠清理、IP 能夠模擬,而且 IP 還會出現區域網相同 IP 的情況,因此,在使用此方法的時候,應該根據具體情況來思考。
9、簡訊預警機制,做好出問題之後的防護
以上的方法並不一定能夠完全杜絕簡訊被刷,因此,我們也應該做好簡訊的預警機制,即當簡訊的使用量達到一定量之後,向管理員發送預警信息,管理員可以立刻對簡訊的介面情況進行監控和防護。
五、mySQL 里有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中的數據都是熱點數據
相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略(回收策略)。redis 提供 6 種數據淘汰策略:
volatile-lru:從已設置過期時間的數據集(server.db [i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集(server.db [i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db [i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db [i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db [i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據
㈢ 如何用c語言編程,判斷一個三位數是否為順子(不是順子直接提示出錯)
#include<stdio.h>
int main()
{
int n,a,b,c;
scanf("%d",&n);
a=n%10;//個位
b=n%100/10;//十位
c=n/100;//百位
if((a+2==b+1&&b+1==c)||(a==b+1&&b+1==c+2))
printf("該數是順子");
else
printf("輸入錯誤");
return 0;
}
希望能幫到你,望採納;
㈣ 求用c語言或c++,編寫判斷五張撲克是同花順等類型的問題。
分成兩類判斷:
1、是不是同花
2、判斷類型
判斷過程:1.進行排序--->2.排序後進行相鄰的兩兩相減--->3.在每次相減的時候對結果進行記錄--->若只有一個0,則為一對;2個連續0則為三條;2個不連續的0則為三兩對;3個連續的0則為四條;3個不連續的0則為三帶一對;4個1則為順子;否則為雜牌。
然後結合是否為同花得出最後結果。
希望能幫到你