自学内容网 自学内容网

字节青训营入门算法题:飞行棋分组

链接:飞行棋分组🔗🔗

题目

现在有一堆飞行棋棋子,每个棋子上标有数字序号。需要将这些棋子分成若干组,每组包含5个棋子,且组内所有棋子的数字序号必须相同。需要判断是否可以完成这样的分组。

解答

为了解决这个问题,我们可以使用以下步骤:

  1. 对棋子序号进行排序。
  2. 遍历排序后的棋子序号,检查每组连续相同序号的棋子数量是否为5。
  3. 如果在遍历过程中发现任何一组棋子数量不等于5,则返回 false
  4. 如果所有组都满足条件,则返回 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

这段代码首先将输入字符串转换为数字数组,并对数组进行排序。然后使用两个指针 startend 来遍历数组,检查每组连续相同序号的棋子数量是否为5。如果在任何点上不满足这个条件,函数会立即返回 false。如果所有组都满足条件,函数在结束时返回 true
在代码中,我修正了几个问题:

  • 输入应该是字符串,需要先转换为数组。
  • sort() 方法默认按照字符串排序,所以需要传递一个比较函数来正确排序数字。
  • end 的初始化应该为0,因为我们从数组的第一个元素开始。
  • 最后,返回值应该是布尔类型,而不是字符串。

原文地址:https://blog.csdn.net/everfoot/article/details/142891424

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!