字母移位
题目来源:LeetCode No.846
题目描述:
爱丽丝有一手(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
的组。
提示:
1. 1 <= hand.length <= 10000
2. 0 <= hand[i] <= 10^9
3. 1 <= W <= hand.length
思路分析:
要组成任意组大小为W
的顺子,则·hand·数组的元素个数必定为W
的整数倍。首先处理hand
数组,确定每种牌的数量存储在数组arr
中(arr
的索引为牌的值,索引处的值为该牌的数量);然后再次遍历数组hand
,从小到大排顺子(每W
张连续递增1
的牌为一组顺子),若能全部排完则返回true
。
代码示例:
/**
* @param {number[]} hand
* @param {number} W
* @return {boolean}
*/
var isNStraightHand = module.exports = function(hand, W) {
let len = hand.length;
if (len % W !== 0) return false;
let cop = [...hand].sort((a,b) => a - b);
let arr = [];
for (let i = 0; i < len; i++) {
if (arr[cop[i]]) {
arr[cop[i]]++;
} else {
arr[cop[i]] = 1;
}
}
for (let i = 0; i < len; i++) {
if (arr[cop[i]] > 0) {
for(let j=0; j<W; j++) {
if (arr[cop[i]+j] > 0) {
arr[cop[i]+j]--;
} else {
return false;
}
}
}
}
return true;
};