2012-05-31 76 views
5

我的家庭作業的問題:C++查找在陣列數量最多

命名parkingTickets的整數數組已經聲明並初始化爲自今年年初被我市警方每天給出了停車票的數量。 (因此,數組的第一個元素包含1月1日給出的票數;最後一個元素包含今天給出的票數)

已聲明和初始化一個名爲ndays的變量以保存陣列。 (因此,如果今天是1月18日,那麼該值將爲18;如果今天是2月3日,則該值將爲34)。

此外,已聲明名爲mostTickets的變量以及變量k 。

如果不使用任何附加變量,並且不更改ndays或parkingTickets數組的元素的值,請編寫一些代碼,以便導致包含parkingTickets中找到的最大值的大多數票據。

對於這一點,我有以下代碼:

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

但我的鍛鍊提交是說這是錯的。我的代碼有什麼問題?我也嘗試了parkingTickets[ndays - 1],但那也行不通。

+1

您是否測試了代碼以查看它是否正常工作?它看起來是對的(乍一看) – Jon

+3

你不應該把'parkingTickets [k]'與'mostTickets'比較,而不是'parkingTickets [ndays]'(它可以是一個過去的數組的末尾)關於如何聲明數組,並通過您的聲明)? – birryree

+1

對不起,我沒有看到「家庭作業」標籤,並提供了一個直接的解決方案。刪除了我的答案。 – mfontanini

回答

9

您的比較錯誤。您每次都將當前元素與最後一個元素進行比較。你需要做的是將當前元素與大多數票據進行比較。即

if(parkingTickets[k] > mostTickets) 

此外,爲了好的措施,我會建議初始化大多數票到parkingTickets [0]。

+0

「另外,爲了更好的衡量,我會建議初始化大多數票以停車票[0]。」 - 是的,要麼是0,要麼使用parkingTickers [0],那麼for循環可以改爲'k = 1; k

+1

如果你初始化'mostTickets = parkingTickets [0];',你應該檢查以確保'ndays> 0'(否則你會讀過空數組的末尾)。 – user

+0

我發現,初始化爲0的問題是,如果數組包含所有負數,則會遇到問題。奧利弗也打了好電話。你不想要一個數組超出界限的錯誤。 –

11

C++也提供了std::max_element。我懷疑你的老師是否希望你使用這個,但是對標準庫的瞭解可能是很好的。

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

+1最好的解決方案是始終停止嘗試重新實現標準庫。 – ildjarn

+0

+1哇!我從來沒有新的! – Rhexis

+0

由於這是家庭作業,我懷疑使用std :: max_element()的解決方案將不被接受用於獲得成績。 –

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),因爲我們正在循環數組和一些比較工作。