题目:
爱丽丝有一手(hand)由整数数组给定的牌。
现在她想把牌重新排列成组,使得每个组的大小都是 W,且由 W 张连续的牌组成。
如果她可以完成分组就返回 true,否则返回 false。
示例1:
输入:hand = [1,2,3,6,2,3,4,7,8], W = 3 输出:true
解释:爱丽丝的手牌可以被重新排列为 [1,2,3],[2,3,4],[6,7,8]。
示例2:
输入:hand = [1,2,3,4,5], W = 4 输出:false
解释:爱丽丝的手牌无法被重新排列成几个大小为 4 的组。
简单介绍:
题目:一手顺子
题目难度:中等
使用语言:JAVA。
这道题来自leetcode题库的Ordered Map标签。
如果想要加深对java拥有数据结构类型的理解,特别是Map的理解,做这类型的题是提升很快的。
解题思路:
首先看题、分析题意,我们可以明确2个关键点:
1.一手(hand)张牌可以分组,每个组大小都是W。
2.每组都是由W张连续的牌组成。
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,
数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用,以从小到大为牌的顺序,统计每张牌的个数。
这里有两种方法,分别是顺序的List表和TreeMap。
在这里我们采用TreeMap,变量命名为count。
因为TreeMap是按键从小到大排序的,而JAVA对TreeMap的封装比较好。
算法:
既然明确了TreeMap作为解决该题的数据结构,我们就可以开始我们的算法分析了。
1.统计每张牌的个数,然后加入TreeMap。
2.统计每组大小为W的顺子,一次统计去掉count内的W张牌。
如果无法统计出W张牌,则返回false,否则,返回true。
代码部分:
class Solution {
public boolean isNStraightHand(int[] hand, int W) {
//无法使各个小组都为W
if(hand.length%W!=0) {
return false;
}
else {
TreeMap <Integer,Integer> count;
count=new TreeMap<>();
//卡牌查找,统计每张牌的个数
for(int card:hand) {
if(!count.containsKey(card)) {
count.put(card, 1);
}
else count.replace(card, count.get(card)+1);
}
//统计每组大小为W的顺子
while(count.size()>0) {
int first=count.firstKey();
for(int i=first;i<first+W;i++) {
if(!count.containsKey(i)) {return false;}
if(count.get(i)==1) {count.remove(i);}
else count.replace(i, count.get(i)-1);
}
}
return true;
}
}
}
结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!