【问题标题】:Algorithm confusion in codewars代码战中的算法混乱
【发布时间】:2016-05-03 20:17:09
【问题描述】:

那么问题来了:

新的“复仇者联盟”电影刚刚上映!电影院售票处有很多人排着长队。他们每个人都有一张 100、50 或 25 美元的钞票。 “复仇者联盟”门票 25 美元。

Vasya 目前是一名文员。他想把票卖给这条线上的每一个人。

如果 Vasya 最初没有钱并严格按照人们排队的顺序出售门票,Vasya 是否可以向每个人出售一张票并找零?

返回 YES,如果 Vasya 可以向每个人出售一张票并提供找零。否则返回NO。

我的代码:

function tickets(peopleInLine) {
  var speakVasya = "";
  var vasyaValue = 0;
  for (var i = 0; i < peopleInLine.length; i++) {
    if (peopleInLine[i] - 25 > vasyaValue) {
      speakVasya = "NO";
      break;
    } else {
      vasyaValue += 25;
      speakVasya = "YES";
    }
  }
  document.write(speakVasya);
}


tickets([25, 25, 50]);

现场演示在这里 https://jsfiddle.net/py234z11/1/

我的问题是,根据 codewars,我的解决方案通过了 7 次测试,但在 2 次失败,但我无法理解哪些测试,因为它没有给出放入门票功能的争论。

【问题讨论】:

  • 我觉得缺少很多必需的信息。如果每个人都有一张 25 美元的钞票,而一张票是 25 美元,那么他不需要任何零钱,只需将每个人排队卖一张票。
  • @IMTheNachoMan 是的,对不起,英语不是我的母语,我尽力解释它。因此,如果每个人都有 25 美元,比如说 30 个人,即门票([25,25,25,25....]),程序将按应有的方式打印 YES,因为她永远不会用完钱。但是如果第一个人有 25 美元,第二个人有 100 美元的钞票等待 75 零钱,那么可怜的 Vasya 将没有任何多余的零钱,所以它会打印 NO
  • 没有看到你的输入行我们怎么知道。

标签: javascript algorithm math numbers


【解决方案1】:

计算他持有的金额是不够的 - 你需要跟踪账单的数量。

例如,如果您有一张 100 美元的钞票,您不能为持有 50 美元或 100 美元钞票的人找零,您需要特定的钞票(25 美元的钞票可以换成 50 美元,25 美元和 50 美元或三张 25 美元的钞票可以为 100 美元的钞票找零)。

因此,与其保持收款总额,不如跟踪收款的数量。

【讨论】:

  • 另外,如果有人有 100 美元,你需要给他们 50 美元 + 25 美元(如果有的话),而不是 3 x 25 美元。
【解决方案2】:

我针对这个问题的 C# 解决方案,已编辑

public static string CanSellTickets(int[] peopleInLine) {

        int count25 = 0;
        int count50 = 0;

        for (var i = 0; i < peopleInLine.Length; i++) {
            if (peopleInLine[i] == 25) {
                count25++;
            }
            else if (peopleInLine[i] == 50) {
                if (count25 == 0) {
                    return "NO";
                }
                else {
                    count25--;
                    count50++;
                }
            }
            else if (peopleInLine[i] == 100) {
                if (count50 >= 1 && count25 >= 1) {
                    count25--;
                    count50--;
                }
                else if (count50 == 0 && count25 >= 3) {
                    count25 = count25 - 3;
                }
                else {
                    return "NO";
                }
            }
        }

        return "YES";
    }

【讨论】:

  • 我认为您需要切换前两个 100 美元箱子的顺序。如果我们在可以退回一张 50 美元和一张 25 美元的情况下退回三张 25 美元的钞票,那么我们可能会用完 25 美元的钞票,否则我们就足够了。例如,[25, 25, 50, 50, 25, 25, 25, 100, 100] 在我们遇到最后一位顾客时,按照您的技术,收银台上有两张 50 美元的钞票和一张 100 美元的钞票,我们无法找零。如果我们切换这两种情况,那么它将包含两张 25 美元、一张 50 美元和一张 100 美元的钞票,因此我们可以为最后一位客户进行零钱。
猜你喜欢
  • 2013-05-27
  • 2016-05-20
  • 1970-01-01
  • 2011-02-12
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多