【问题标题】:Split Schedule of 192 Games into Weeks of 6 Games, Without Repeating Teams将 192 场比赛的赛程分成 6 场比赛的周,没有重复的团队
【发布时间】:2019-09-17 12:15:53
【问题描述】:

我编写了一个联赛日程表,这样 12 支球队总共进行了 192 场比赛(每支对阵同盟对手 4 次,各对阵跨盟对手 2 次)。我也洗牌了这些游戏。

我的最后一步是将这 192 场比赛分成 16 周,每场 6 场。但是,重要的是每支球队在任何给定的一周内只出现一次(即 - 每周只打一场比赛)。这是我坚持的部分。

我的计划数组看起来像这样:

let schedule = ["a : b", "c : d", "e : f", "g : h", "i : j", "k : l", "m : n", "o : p", "q : r", "s : t", "u : v", "x : y", "a : c", "d : f", "g : i", "l : o"]; // remember, this is actually 192 elements long

从这个数组(记住它有 192 个元素,所以它比上面的大,这是一个展示数据结构的例子)我想生成 week1,它是一个包含 6 个元素的数组schedule数组,像这样:

let week1 = ["a : b", "c : d", "e : f", "g : h", "i : j", "k : l"];

以上是我想要的结果。但是,我不能只使用schedule.slice(0, 6) 来获得 6 个元素,因为我最终会导致团队打两次,就像这样:

let week1 = ["a : b", "c : d", "a : e", "f : g", "h : i", "j : k"]; // Notice "a" is playing twice here, which I do not want.

那么,问题是,我怎样才能从我的 192 场比赛中取出 6 场比赛,但确保每支球队在这 6 场比赛中只出现一次?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    const games = ["a : b", "c : d", "e : f", "g : h", "i : j", "k : l", "m : n", "o : p", "q : r", "s : t", "u : v", "x : y", "a : c", "d : f", "g : i", "l : o"];
    
    const teamsTaken = new Set();
    const result = [];
    
    for(const game of games) {
      if(result.length >= 6) break;
      
      const [teamA, teamB] = game.split(" : ");
      if(teamsTaken.has(teamA) || teamsTaken.has(teamB)) continue;
      
      teamsTaken.add(teamA);
      teamsTaken.add(teamB);
      
      result.push(game);
     }
     
     console.log(result);

    使用 Hashtable 排除重复项。

    【讨论】:

    • 谢谢@Jonas!还有两个想法,为了清楚起见,“团队”可能应该被命名为“游戏”。最后,我想从最初的游戏数组中删除这 6 款游戏,这样当我再次运行此程序时,下一轮不会出现相同的游戏。
    • 我继续编辑答案以反映这一点。
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多