第一题 扑克牌顺子
思路参考 https://blog.csdn.net/gg543012991/article/details/52770415
我们可以把五张牌看成由五个数字组成的数组。大小王是特殊的数字,我们不妨把他们定义为0,这样就能和其他牌区分开来了。
接下来我们分析判断5个数字是不是连续的,最直观的方法是把数组排序。值得注意的是,由于0可以当成任意的数字,我们可以用0去补满数组中的空缺。如果排序之后的数组不是连续的,即相邻的两个数字像个若干个数字,但只要我们有足够的0可以补满这两个空缺的数字,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5},在1和3之间空缺一个2,刚好我们有一个0,也就是我们可以把它当成2去填补这个空缺。
于是我们需要做3件事:首先把数组排序,再统计数组中0的个数,最后统计排序之后数组中相邻的数字之间的空缺总数。如果空缺综述小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。
package com.lyc.dataautest;
import java.util.Arrays;
public class IsContinuousFun {
public static boolean isconti(int[] arr) {
int cnt=0;
if(arr==null) return false;
Arrays.sort(arr);
for(int num:arr){
if(num==0) {
cnt++;
}
}
for(int i=cnt+1;i<arr.length;i++) {
//前后相等,说明不是连续的
if(arr[i]==arr[i-1]) {
return false;
}
//计算前后两个的差值是不是等于1,不够的能不能用0的大王来补
cnt-=arr[i]-arr[i-1]-1;
System.out.println(cnt);
}
if(cnt==0) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
int[] arr={0,3,4,5,1};
isconti(arr);
}
}
第二题 圆圈中最后剩下的数
参考 https://www.cnblogs.com/xuanxufeng/p/6890910.html
约瑟夫环 f(n,m)=f((n-1,m)+m)%n
int LastRemaining(int n,int m){
if(n<1||m<1) return -1;
int last=0;
for(int i=2;i<=n;i++)
last=(last+m)%i;
return last;
}