NC63:扑克牌顺子

扑克牌顺子

http://www.nowcoder.com/questionTerminal/762836f4d43d43ca9deb273b3de8e1f4

解法1:排序+遍历
1.进行排序 2.计算0的个数 3.看是否有对子 4.计算相邻数之间的间隔

import java.util.Arrays;
public class Solution {
    public boolean isContinuous(int [] numbers) {
        int zero=0;//记录0的个数
        int distance=0;//记录空缺的数
        if(numbers.length==0){
            return false;
        }
        Arrays.sort(numbers);
        for(int i=0;i<numbers.length-1;i++){
            if(numbers[i]==0){
                zero++;//找不到非0的就继续下一次循环
                continue;
            }
            if(numbers[i]!=numbers[i+1]){
                distance=distance+numbers[i+1]-numbers[i]-1;
                //4 和 8,中间空缺3
            }
            else
                return false;//说明有对子,肯定不是顺子
        }
        if(distance<=zero)//0的数目大于空缺;
            return true;
        return false;
    }
}

解法2:最大值与最小值的差值应该小于5-count0;
首先不能有重复值;
不包含0的情况:没有重复值,形如[1 2 3 4 5] 会发现最大值与最小值的差值应该小于5
包含0:计算0出现的次数count,没有重复值,最大值与最小值的差值应该小于5-count;
即:用set来填充数据,0不要放进去。set的大小加上0的个数必须为5个。此外set中数值差值在5以内

import java.util.TreeSet;
public class Solution {
    public boolean isContinuous(int [] n) {
        if (n.length < 5 || n.length > 5) {
            return false;
        }
        int num = 0;
        TreeSet<Integer> set = new TreeSet<> ();
        for (int i=0; i<n.length;i++) {
            if (n[i]==0) {
                num ++;
            } else {
                set.add(n[i]);
            }
        }
        if ((num + set.size()) != 5) {
            return false;
        }
        if ((set.last() - set.first()) < 5) {
            return true;
        }
        return false;
    }
}
名企高频面试算法题解 文章被收录于专栏

牛客题霸 - 程序员面试高频题 - 题解

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务