执行结果:

通过

执行用时和内存消耗

题目:

找到连续赢k场比赛的第一位玩家

思路:

  1. 初始化:
    • c用于记录当前玩家连续战胜的玩家数量。
    • i用于遍历数组中的每个玩家。
    • last_i用于记录上一个遍历到的玩家编号,但在原代码中这个变量实际上没有起到应有的作用。
  2. 外层循环:
    • 遍历数组中的每个玩家,以当前玩家为起点,尝试找到连续战胜k名其他玩家的玩家。
  3. 内层循环:
    • 从当前玩家i的下一个玩家开始,检查是否有连续的技能值低于当前玩家的玩家。
    • 如果找到这样的玩家,c递增,表示当前玩家又战胜了一名玩家。
    • 同时,j递增,以检查下一个玩家。
  4. 检查连续胜利次数:
    • 如果c等于k,表示当前玩家连续战胜了k名其他玩家,返回当前玩家的编号。
  5. 重置连续胜利次数和更新遍历索引:
    • 如果当前玩家没有连续战胜k名其他玩家,重置c为1(但这里应该是0,因为对于下一个玩家来说,连续胜利次数应该从0开始计数)。
    • 更新last_i为当前玩家的编号(但这个变量在原代码中没有被正确使用)。
    • 更新i为j,即下一个要检查的玩家的编号。
  6. 返回结果:
    • 如果遍历完所有玩家都没有找到满足条件的玩家,返回last_i(但这里应该返回-1或其他错误代码,因为last_i只是记录了最后一个遍历到的玩家编号,并不能表示赢家)。

int findWinningPlayer(int* skills, int skillsSize, int k) {
    int c= 0;
    int i = 0, last_i = 0;

    while (i < skillsSize) {
        int j = i + 1; 
        while (j < skillsSize && skills[j] < skills[i] && cnt < k) {
            j++;
            c++;
        }
        if (c== k) {
            return i;
        }
        c = 1;
        last_i = i;
        i = j;
    }
    return last_i;
}

上面代码虽然符合题目要求但仍然有不足

  1. c的重置应该是0而不是1。
  2. last_i变量没有被正确使用,且其存在性在原代码中并没有实际意义。
  3. 内层循环中j++应该在判断条件之后执行,以确保每次循环迭代都进行了比较。但原代码中这个错误实际上并没有出现,因为j++和c++是在同一个代码块中执行的,只是逻辑上的顺序应该更清晰。
  4. 如果没有找到满足条件的玩家,应该返回-1或其他错误代码。

以下是改进的代码:

int findWinningPlayer(int* skills, int skillsSize, int k)

  {

      if (k >= skillsSize) {

             return -1; // 如果k大于或等于玩家数量,则不可能有玩家连续战胜k名其他玩家

}

      int c = 0;

      int i = 0;

      while (i < skillsSize) {

             c= 1; // 从当前玩家开始计数(但这里实际上应该是从0开始计数,不过由于我们检查的是cnt < k,所以初始化为1也可以,但逻辑上更清晰的是从0开始)

             int j = i + 1;

             while (j < skillsSize && skills[j] < skills[i]) {

                  c++;

                   if (c== k) {

                        return i; // 如果当前玩家连续战胜了k名其他玩家,返回当前玩家的编号 } j++; } i++; // 移动到下一个玩家

                       }

return -1; // 如果没有找到满足条件的玩家,返回-1

}

更多推荐