字节青训营入门算法题:飞行棋分组
链接:飞行棋分组🔗🔗
题目
现在有一堆飞行棋棋子,每个棋子上标有数字序号。需要将这些棋子分成若干组,每组包含5个棋子,且组内所有棋子的数字序号必须相同。需要判断是否可以完成这样的分组。
解答
为了解决这个问题,我们可以使用以下步骤:
- 对棋子序号进行排序。
- 遍历排序后的棋子序号,检查每组连续相同序号的棋子数量是否为5。
- 如果在遍历过程中发现任何一组棋子数量不等于5,则返回
false
。 - 如果所有组都满足条件,则返回
true
。
知识点
- 数组排序:使用
sort()
方法对数组进行排序。 - 遍历数组:使用
for
循环遍历数组元素。 - 条件判断:使用
if
语句来检查条件是否满足。
讲解
以下是代码实现,其中包含了对之前实现的修正:
function solution(nums) {
// 将输入字符串转换为数字数组
let pieces = nums.split(' ').map(Number);
// 对棋子序号进行排序
pieces.sort((a, b) => a - b);
// 初始化起始和结束指针
let start = 0;
let end = 0;
// 遍历排序后的棋子序号
while (end < pieces.length) {
// 移动结束指针直到遇到不同的棋子序号
while (end < pieces.length && pieces[end] === pieces[start]) {
end++;
}
// 检查当前组棋子数量是否为5
if ((end - start) !== 5) {
return false; // 如果不是5,则无法完成分组,返回false
}
// 更新起始指针到下一组
start = end;
}
// 如果所有组都满足条件,返回true
return true;
}
// 测试样例
console.log(solution("1 2 3 4 5")); // 输出 false
console.log(solution("1 1 1 1 2 1 2 2 2 2")); // 输出 true
这段代码首先将输入字符串转换为数字数组,并对数组进行排序。然后使用两个指针 start
和 end
来遍历数组,检查每组连续相同序号的棋子数量是否为5。如果在任何点上不满足这个条件,函数会立即返回 false
。如果所有组都满足条件,函数在结束时返回 true
。
在代码中,我修正了几个问题:
- 输入应该是字符串,需要先转换为数组。
sort()
方法默认按照字符串排序,所以需要传递一个比较函数来正确排序数字。end
的初始化应该为0,因为我们从数组的第一个元素开始。- 最后,返回值应该是布尔类型,而不是字符串。
原文地址:https://blog.csdn.net/everfoot/article/details/142891424
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!