通常在获得任务时,我们会尝试一次性完成所有任务,但您可以尝试将问题抽象为更小的“组件”。尝试将其视为烹饪时的食谱,您只需编写需要采取的步骤,然后再写出代码。
首先,从你的主要方法开始,你已经这样做了
public static void main(String[] args) {
}
接下来,您有一个要求说明
生成不高于 9 的分数
所以你可以做的是创建一个“分数”数组,并用每个玩家的分数填充它(我使用玩家而不是人,因为你提到了“分数”和“参赛者”)。
public static void main(String[] args) {
// generate a score for each of the contestants
}
并将他们与另一个与另一个人的分数相加为 10 的“人”配对。
public static void main(String[] args) {
// generate a score for each of the contestants
// if score of player1 and another player is equal to 10, save pair
}
该if
语句有点繁琐,因此我们可以尝试将其分解。为简化起见,请尝试考虑仅对一名玩家进行测试。
public static void main(String[] args) {
// generate a score for each of the contestants
// take score of first player, s
// compare s + x = 10, where x is score of other player
// if x = 10 - s, save pair
}
现在我们得到了一些更简单的东西。让我们尝试输入一些代码。
public static void main(String[] args) {
int[] scores = new int[20];
// generate a score for each of the contestants
for (int i = 0; i < scores.length; ++i) {
scores[i] = getRandomNumber();
}
// take score of first player, s
int s = scores[0]; // the first player is at index 0
// compare s + x = 10, where x is score of other player
for (int i = 1; i < 20; ++i) {
// note: We don't have to test against index 0 (that's the first player)
// so we start at index 1
// if x = 10 - s
int x = scores[i];
if (x == 10 - s) {
// save pair
}
}
}
public static int getRandomNumber() {
// todo: generate a random score between 0 and 9 and return it
return 4;
}
您似乎知道如何for
在原始代码中使用循环。您没有做的是在数组中分配一个值。(scores[i] = x;
其中 x 是一个 int) 负责处理这一点,类似于分配一个 int 例如,int a = 0
. 我使用了一种方法来生成一个返回的分数int
,因为如何获取随机值的实现是“不感兴趣的”(所以我们将它抽象出来)。所以 for 循环为数组的每个索引设置一个分值。
接下来,由于scores
数组中有参赛者的所有分数,我们需要将它们配对。使用一些简单的数学,我们构造了一个 if 语句来检查第一个玩家和第二个玩家的得分是否总和为 10。
接下来我们需要保存成对的参赛者。您在创建二维数组的正确道路上,一个用于容纳球员,另一个用于“团队”。填充这个数组时,二维数组看起来像这样
| players |
| 0 1 |
-------+----+----+
team 0 | 0 | 1 |
team 1 | 3 | 7 |
team 2 | 8 | 9 |
-------+----+----+
即我们将玩家 0 与 1、玩家 3 与玩家 7、玩家 8 与玩家 9 组队。从中我们注意到团队索引 (0-2) 与实际玩家无关,因此我们可以得出结论,我们需要团队的单独索引。
public static void main(String[] args) {
// generate a score for each of the contestants
// create the team array, 10 teams each with 2 participants
// for every player: take score of player, s
// compare s + x = 10, where x is score of every other contestant
// if x = 10 - s
// assign the current team to player s and player x
// increment team integer (assign next team)
}
因此,使用与您的代码类似的代码,我们构建了 teams 数组并将第一支球队分配给我们的球员,然后再继续其他球队。
// create the team array, 10 teams, each with 2 participants
int[][] teams = new int[10][2];
// assign the first team to player 3 and player 7
teams[0][0] = 3;
teams[0][1] = 7;
这只是一个示例,其中Team 0被分配了两名队员,一名在索引 0,一名在索引 1,分别分配给玩家3和玩家7。
这很棒。我们现在可以将一名玩家与其他任何玩家配对。由此,我们知道我们需要一个“当前队伍”的计数器,因为每个参赛者在这一轮中不必有一个队友,当一个队伍被分配时,我们应该分配下一个。
public static void main(String[] args) {
int[] scores = new int[20];
// generate a score for each of the contestants
// ... same as before
// create the team array, 10 teams each with 2 participants
int[][] pairs = new int[10][2];
// create a team integer
int currentTeam = 0;
// for every player: take score of player, s
for (int i = 0; i < 20; ++i) {
// todo: test if player i is already in teams array and continue; if it is
int s = scores[i];
for (int j = i + 1; j < 20; ++j) {
// compare s + x = 10, where x is score of every other contestant
int x = scores[j];
// if x = 10 - s
if (x == 10 - s) {
// assign the current team to player i and player j
pair[currentTeam][0] = i;
pair[currentTeam][1] = j;
// increment team integer (assign next team)
++currentTeam;
}
}
}
}
请注意,第二个 for 循环从 开始i + 1
,因为我们已经测试了具有较低索引的播放器。
还; 你没有提到,但是这个问题有一个“隐藏”的约束,每一对都是排他的,所以一个参赛者只能参加一次。您应该添加第三个 for 循环来检查 teams 数组是否已经包含玩家。
因此,通过分解问题,我们设法获得了一些可能有效或无效的代码,但无论如何,逻辑都是通过推理创建的,这在解决问题时总是很重要!