統計陣列中各元素出現次數

2021-07-29 02:44:50 字數 1320 閱讀 7253

給定一大小為n的整數陣列,其元素取值範圍為[1,n],請統計各元素出現的次數,並要求時間複雜度為o(n),空間複雜度為o(1)。

若沒有空間的限制,則可直接開闢乙個大小等於元素最大值的陣列對各元素進行統計,並且順帶還進行了時間複雜度為o(n)的排序(比快速排序還快哦)。

統計n個元素出現的次數,每個元素對應乙個次數資訊需要儲存,那麼就需要n個空間;而現在不讓開闢新的n個空間,這些資訊又必須要記錄,那你說該放在哪?當然是原陣列中囉!

不過問題又來了,原陣列中的值豈不是會被覆蓋掉?好吧,可以先把陣列中原來的值拿出來後放跟次數相關的資訊就沒問題了。對於拿出來的這個值,必須即拿即用(不然堆積起來又要n個空間來儲存),由於元素取值範圍為[1,n],因此可以將這個值當作陣列的索引來訪問下個元素(記得-1)。

還有個問題,若像數字5出現了2次,第一次遇到數字5時,將a[4]中原來的值取出用來訪問下乙個元素並將a[4]清零後+1表示5已經出現過1次了;第二次遇到數字5時問題就來了,不能將現在a[4]中的值取出用來訪問下個元素,只能將a[4]加1表示又遇到5了。也就是說乙個元素沒被訪問過和被訪問過兩種狀態得區別對待,那麼,怎麼知道元素有沒有被訪問過呢?之前每個元素需要記錄次數相關資訊,現在每個元素又要體現有沒有被碰過,如何讓乙個值體現這兩種屬性呢?我們知道乙個數除了大小外還有正負這個屬性,因此這裡便將被訪問過的元素設為負值(因為原陣列中元素均為正值且沒被碰過),於是第一次遇到某個元素時現將它清零後-1,以後每遇到一次就-1。最後將值取反便得到各元素對應的出現次數。

最後還有乙個問題,就是當再次訪問某個元素時,由於其值為負表示其出現的次數,就沒辦法從中得到訪問下一元素所需的資訊,程式沒辦法進行下去!因此,這個時候需要手動指定下乙個訪問的元素是誰,當然是從頭到尾全部指定一遍(儘管被指定的元素可能之前已經被訪問過了,沒關係,再指定下乙個就好了),既保證所用元素都被至少訪問過一次又可以使整個過程終止。例如,第一次指定a[0],第二次指定a[1],...,直到a[n-1]為止。還請注意的是,通過手動指定而訪問到的元素只需要將值清零而不用-1,因為沒有數字指向它,當然出現的次數也就是0囉!

題外話:乙個問題之所以不像它看上去那麼簡單,除了需要奇葩的想法外,就是要處理各種特殊的狀況。

#include #define n 7

void elementcounter(int array,int n);

int main(void)

; elementcounter(array,n);

return 0;

}void elementcounter(int array,int n)

else//某元素不是第一次被訪問

}//列印元素出現次數

for(i=0;i}

QT中統計陣列中各元素出現的次數

字串陣列中儲存著5次字元識別同一編號的結果,判斷超過3次識別出相同的字串,即為識別成功。所以需要判斷5個字串中是否有大於等於3個相同的?等同於統計陣列中各元素出現的次數 qstringlist m socrcharlist 存5次識別出的結果進行判斷 m socrcharlist b025292a0...

8 統計陣列中數字出現次數

8.給定陣列a,大小為n,數字元素為1 n的int數,但是有些數字出現多次,有些數字沒出現,統計出哪些數字出現了多次,哪些數字沒有出現,要求額外空間使用o 1 時間o n 答 空間複雜度為o 1 故不能用額外的空間,即在陣列本身上操作。時間為o n 故不能用先排序後比較相鄰元素的方法,時間為o nl...

陣列元素出現次數

10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數 要求下排每個數都是先前上排那十個數在下排出現的次數。上排的十個數如下 0,1,2,3,4,5,6,7,8,9 舉乙個例子,數值 0,1,2,3,4,5,6,7,8,9 分配 6,2,1,0,0,0,1,0,0,0 0在下排出現了6次,1在下...