美文网首页
Java日记2018-05-22

Java日记2018-05-22

作者: hayes0420 | 来源:发表于2018-05-22 06:59 被阅读0次

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

    相关文章

      网友评论

          本文标题:Java日记2018-05-22

          本文链接:https://www.haomeiwen.com/subject/hjbcjftx.html