題目描述
劍指Offer——撲克牌中的順子(JS實作) 解題思路
- 本題采用的是通過零數組來輔助判斷是否是順子
- 具體的過程,代碼注釋中都有
解題代碼
var isStraight = function (nums) {
// 将nums數組中所有0元素放入下面的數組中
const zeroArr = [];
// 将數組從小到大進行排序
nums.sort((num1, num2) => num1 - num2);
// 将含零的元素添加到0的數組中
for (let i = 0; i < nums.length; i++) {
if (nums[i] === 0) {
zeroArr.push(nums[i]);
}
}
// 将nums數組中的0全部過濾掉
nums = nums.filter(value => value !== 0);
// 如果nums數組中含有重複元素,說明不是順子,直接傳回false
if ([...new Set(nums)].length !== nums.length) return false;
// 周遊nums的所有非零元素
for (let i = 1; i < nums.length; i++) {
// 如果後一個比前一個大一,說明屬于順子,繼續判斷
if (nums[i] - nums[i - 1] === 1) {
continue;
} else if (nums[i] - nums[i - 1] > 1) {
// 如果後一個比前一個大的多,首先判斷0數組中是否有元素,沒有則傳回false
if (zeroArr.length === 0) return false;
// 如果有0元素,則判斷零的個數是否能夠填補空缺的數字
if (zeroArr.length >= nums[i] - nums[i - 1] - 1) {
for (let j = 0; j < nums[i] - nums[i - 1] - 1; j++) {
zeroArr.pop();
}
} else {
return false;
}
}
}
return true;
};
總結(本題給我們的啟示思路)
- 啟示一:學會使用輔助數組來判斷目标元素
- 啟示二:學會通過集合給數組進行去重
- 啟示三:學會通過filter進行過濾數組