在C++中查找数组中最大的数

5

我的作业问题:

一个名为parkingTickets的整数数组已被声明并初始化为城市警察每天自今年开始以来发出的停车罚单数量。(因此,数组的第一个元素包含了1月1日发放的罚单数量;最后一个元素包含了今天发放的罚单数量。)

一个名为ndays的变量已被声明并初始化为数组的大小。(因此,如果今天是1月18日,则ndays的值为18;如果今天是2月3日,则ndays的值为34。)

此外,还声明了一个名为mostTickets的变量和一个名为k的变量。

不使用任何额外的变量,并且不改变ndays或parkingTickets数组的值,编写一些代码,使得mostTickets包含在parkingTickets中找到的最大值。

为此,我有以下代码:

for(k = 0; k < ndays; k++) {
    if (parkingTickets[k] > parkingTickets[ndays]) {
        mostTickets = parkingTickets[k];
    }
}

但是我的练习提交器显示它是错误的。我的代码有什么问题?我也尝试了 parkingTickets[ndays - 1],但那也不起作用。


1
你测试过代码看看它是否能正常工作了吗?乍一看,它看起来是正确的。 - Jon Egeland
3
你是不是应该将parkingTickets[k]mostTickets进行比较,而不是与parkingTickets[ndays]进行比较(根据你的陈述,parkingTickets[ndays]可能是数组末尾或超出数组末尾,具体取决于数组是如何声明的)? - wkl
1
抱歉,我没有看到“作业”标签并提供了直接的解决方案。已删除我的答案。 - mfontanini
4个回答

12

C++还提供了std::max_element。我怀疑你的老师不希望你使用它,但知道标准库也是很好的。

mostTickets = *std::max_element(parking_tickets, parking_tickets + ndays)

1
最佳解决方案始终是停止尝试糟糕地重新实现标准库。 - ildjarn
由于这是一份作业,我怀疑使用std::max_element()的解决方案不会被接受作为成绩提交。 - Code-Apprentice

9

您的比较是错误的。每次都将当前元素与上一个元素进行比较。您需要做的是将当前元素与mostTickets进行比较。例如:

if(parkingTickets[k] > mostTickets)

此外,为了保险起见,我建议将mostTickets初始化为parkingTickets[0]。

此外,为了保险起见,我建议将mostTickets初始化为parkingTickets [0]。是的,要么是0,要么使用parkingTickers [0],然后for循环可以更改为k = 1; k < ndays...以强调逻辑。 - Tony Delroy
1
如果你初始化mostTickets = parkingTickets[0];,你应该检查确保ndays > 0(否则你会读取超出空数组的末尾)。 - user
将其初始化为0的问题在于,如果数组包含全部为负数的元素,则会遇到问题。Oliver的建议很好,您不希望出现数组越界错误。 - Tanvir Ahmed

1
让我们先分析你的解决方案。
int parkingTickets[] = {3,6,7,4,8,10,0};
int ndays = 7;
for(k = 0; k < ndays; k++) {
    if (parkingTickets[k] > parkingTickets[ndays]) {
    mostTickets = parkingTickets[k]; 
    }
}

这个解决方案的问题在于您没有初始化mostTickets变量,也没有else子句。以下代码可以为您解决问题。
 int parkingTickets[] = {3,6,7,4,8,10,0};
 int ndays = 7;
 int mostTickets = -1;
 for(int k = 0; k < ndays; k++) {
    if (parkingTickets[k] > mostTickets) {
    mostTickets = parkingTickets[k]; 
    }
 }

在此之后,mostTickets将保存数组中最大数字的值。由于我们需要循环遍历数组并进行比较,因此此解决方案需要O(n)的时间来完成。


-2
mostTickets = parkingTickets[0]; k = 1;

while (k < ndays) {
   if (mostTickets < parkingTickets[k])
       mostTickets = parkingTickets[k];
   k++;
}

1
这根本没有解释初始代码有什么问题。而且不清楚为什么要使用 while 循环,而不是题目中提供的 for 循环。 - BDL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接