Java日记2018-05-22

2018-05-22  本文已影响0人  hayes0420

第一题 扑克牌顺子
思路参考 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;  
    }  
上一篇下一篇

猜你喜欢

热点阅读