20200321
題目 :撲克牌中的順子
從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。2~10爲數字本身,A爲1,J爲11,Q爲12,K爲13,而大、小王爲 0 ,可以看成任意數字。A 不能視爲 14。
示例:
輸入: [0,0,1,2,5]
輸出: True
思路 :利用桶排序找出給定數組的最大、最小值。
code
class Solution{
public boolean isStraight(int[] nums){
int[] arr = new int[14];
//把每個數放入桶裏,以便找出最大、小值
for(int i=0;i<5;i++){
arr[nums[i]]++;
//如果有非零的重複值則false
if(nums[i]!=0&&arr[nums[i]]>1){
return false;
}
}
int min = -1;
int max = 14;
//找出最小數,從1開始
for(int i=1;i<14;i++){
if(arr[i] == 1){
min = i;
break;
}
}
for(int i=13;i>0;i--){
if(arr[i] == 1){
max = i;
break;
}
}
return max - min <= 4;
}
}
題目 :圓圈中最後剩下的數字
0,1,…,n-1這n個數字排成一個圓圈,從數字0開始,每次從這個圓圈裏刪除第m個數字。求出這個圓圈裏剩下的最後一個數字。
例如,0、1、2、3、4這5個數字組成一個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2、0、4、1,因此最後剩下的數字是3。
思路 :通過求餘可以形成環
code
class Solution{
public int lastRemaining(int n, int m){
if(n==0 || m==0){
return -1;
}
List<Integer> list = new ArrayList<>();
for(int i=0;i<n;i++){
list.add(i);
}
int c=(m-1)%n;
while(list.size()!=1){
list.remove(c);
c = (c + m-1)%list.size();
}
return list.get(0);
}
}