【问题标题】:What container to use when I need to know both the max value and who has achieved it?当我需要知道最大值和谁达到了最大值时使用什么容器?
【发布时间】:2015-08-31 14:52:36
【问题描述】:

我正在尝试通过网站完成初学者练习。

“要求: 变量、数据类型和数值运算符 基本输入/输出 逻辑(if 语句、switch 语句) 循环(for、while、do-while) 数组

编写一个程序,要求用户输入 10 个人(第 1 个人、第 2 个人、...、第 10 个人)早餐吃的煎饼数量 输入数据后,程序必须分析数据并输出哪个人早餐吃的煎饼最多。”

我不确定如何让程序叫出输入煎饼数量最多的人?当然,这需要使用键和值来完成,但需求状态是“数组”而不是“地图”?

下面是我想出的代码,但是这只是输出吃的煎饼的最大数量,所以没有真正回答这个问题!

非常感谢您的帮助!

* 在我确切知道该怎么做之前,我只用了 5 个人来加快这个过程 *

#include <iostream>
using namespace std;

int main()
{
    cout << "how many pancakes did you eat for breakfast?" << endl;

    int person1, person2, person3, person4, person5;
    cout << "Person 1: ";
    cin >> person1;

    cout << "Person 2: ";
    cin >> person2;

    cout << "Person 3: ";
    cin >> person3;

    cout << "Person 4: ";
    cin >> person4;

    cout << "Person 5: ";
    cin >> person5;

    int array[5] = {person1, person2, person3, person4, person5};
    int temp = 0;

    for (int i = 0; i<5; i++)
    {
        if (array[i] > temp)
        {
        temp = array[i];
        }
    }
    cout << "The most pancakes eaten was " << temp << "by " <<  endl;

}

【问题讨论】:

  • 一个数组应该可以正常工作...
  • 你可以创建一个结构体来保存煎饼的名称和数量。
  • 垫子是对的,数组是好的,你也可以跳过创建五个单独的变量。相反,您可以创建一个包含五个元素的 int 数组,然后使用循环作为输入。
  • 在这个问题上使用Map 会显得多余,似乎没有必要。
  • 使用任何容器,甚至是数组,都太过分了

标签: c++ arrays maps


【解决方案1】:

这肯定需要使用键和值来完成

这不是唯一的方法。另一种方法是使用没有键的索引集合,并假设位置k 对应于可以仅从位置计算的键k。例如,如果您有一个包含十个项目的数组,对应于编号为 1 到 10 的十个人,则编号为 k 的人员的数据可以存储在数组中的位置 k-1 中。在这种情况下不需要密钥。

这个冗长的解释意味着,如果你存储最好的i 和最好的tmp,你会在循环之后得到你的答案:

int temp = 0;
int res = -1;
for (int i = 0; i<5; i++) {
    if (array[i] > temp) {
        temp = array[i];
        res = i;
    }
}
cout << "The most pancakes eaten was " << temp << "by " <<  (res+1) << endl;

注意打印的是res+1,而不是res。这是因为数组是从零开始的,而计数是从一开始的。

这可以通过使用初始元素作为当前最佳元素并从1 开始迭代的常见习惯用法进一步缩短:

int res = 0;
for (int i = 1 ; i<5 ; i++) {
    if (array[i] > array[res]) {
        res = i;
    }
}
cout << "The most pancakes eaten was " << array[res] << "by " <<  (res+1) << endl;

【讨论】:

  • 这太完美了!非常感谢!我一直在为如何为每个人分配一个程序调用的值而苦苦挣扎。 “res”的使用效果很好。
  • 这甚至可以通过标准库和std::max_element进行简化
【解决方案2】:

如果您在输入时记录吃的煎饼的最大数量会怎样?

#include <iostream>

using namespace std;

// To execute C++, please define "int main()"

int main() {
  int numPeople = 5;

  int maxPancakes = -1;
  int maxPerson = -1;

  int currentPancakes = -1; 

  for (int i = 1; i < numPeople; i++) {
    cout << "Person " << i << ": ";
    cin >> currentPancakes;

    if (currentPancakes > max) {
      max = currentPancakes;
      maxPerson = i;
    }
  }

  cout << "Person " << maxPerson << " ate the most pancakes: " << maxPancakes;

  return 0;
}

注意:我的 c++ 很生锈,我还没有测试过这个解决方案。只是一个想法;)

【讨论】:

  • 如果你不使用数组,为什么当“Person”从1开始时从0开始?
  • 这很公平!我最初想到了一个使用数组的解决方案,然后将其转储为更简单的东西:) 编辑解决方案
  • 您可以查看我的解决方案以获得其他改进想法:)
【解决方案3】:

对这个问题使用 Map 将是一种矫枉过正。数组绰绰有余。您甚至不需要遍历数组来检查谁吃得最多。获取最大值的操作实际上是 O(0),因为我们可以在您输入值时更新谁吃得最多。

int main(){
    const int NUM_PEOPLE = 10;
    int cakesEaten[10] = {0}; 
    int maxEaten = 0;
    int personId = 0;

    cout << "How many pancakes eaten by:" << endl;
    for(int x=0; x<NUM_PEOPLE; x++){
        cout << "person " << (x+1) << ":";
        cin >> cakesEaten[x];

        if (cakesEaten[x] > maxEaten){
            maxEaten = cakesEaten[x];
            personId = x;
        }
    }
    cout << "The most pancakes was eaten by person " << personID << endl;
}

【讨论】:

  • 您的O(0) 错误,您执行n 测试以找到最大值。它可能需要O(1) 内存作为优化,但即使您的解决方案也需要O(n) 内存。
【解决方案4】:

您根本不需要任何存储空间。

输入数字后,比较它们并存储谁拥有当前最大值及其值

如果您使用第一个人的值作为起始值,则不需要以假值开头,这样如果输入负值,则可以包含在内。这在这里可能很荒谬,但总的来说,这是一种更好的做法。

还请注意,如果我们希望 people1 开头,那么从 1 开始更有意义,然后从 0 开始并尝试记住始终添加 1

这也很容易扩展到更多人,只需更改total_people

int main() {
  const int total_people=5;

  cout << "how many pancakes did you eat for breakfast?" << endl;

  int what;
  cout << "Person 1: ";
  cin >> what;

  int who=1;
  int max_value=what;

  for (int person = 2; person <= total_people; ++person) { 
    cout << "Person " << person << ": ";
    cin >> what;
    if (what > max_value) {
      max_value=what;
      who=i;
    }
  }
  cout << "The most pancakes eaten was " << max_value << "by " << who << endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2010-12-07
    • 2015-05-19
    相关资源
    最近更新 更多