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; } }
名企高频面试算法题解 文章被收录于专栏
牛客题霸 - 程序员面试高频题 - 题解