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);
}
}