[經典面試題]統計數組,經典試題統計數組

來源:互聯網
上載者:User

[經典面試題]統計數組,經典試題統計數組
【題目】

給定數組A,大小為n,數組元素為1到n的數字,不過有的數字出現了多次,有的數字沒有出現。請給出演算法和程式,統計哪些數字沒有出現,哪些數字出現了多少次。能夠在O(n)的時間複雜度,O(1)的空間複雜度要求下完成嗎?

【分析】

我們知道原數組是沒有排序的。如果排序了,很簡單的。O(1)的空間含義,可以使用變數,但不能開闢數組或者map等來計數。

這個題目,很直接的解法就是兩層遍曆,O(n^2)的複雜度,O(1)的空間。空間滿足了,但是時間沒有。

很多類似的題目,都會用XOR的方法,大家仔細想一下,這個題目,可以嗎?或者這個題目和可以用XOR的題目的差異在哪兒?最直接的就是,每一個數位重複的次數是不同的。

還有就是以空間換時間的方法,例如用hash map或者數組來計數。時間滿足了,但是空間沒有滿足。

那怎樣才能有時間複雜度O(n),空間複雜度O(1)的演算法呢?不能開闢新的空間,那麼只剩下,重複利用數組A。那麼該如何利用數組A呢?

(1)首先,我們介紹一種三次遍曆數組的方法,我們都考慮數組從0開始:

第一次遍曆:對於每一個A[i] = A[i] * n
第二次遍曆:對於每一個i,A[A[i]/n]++
第三次遍曆:對於每一個i,A[i] % n就是出現次數

A[i]應該出現在A中的A[i]位置,乘以n、再除以n,很容易的來回變換;第二次遍曆,對於A[i]本來所在的位置不斷增1,但絕對不對超出n的,那每一個i出現的次數,就是A[i]對n取餘。

(2)還有一種兩次遍曆的方法,也是上面的思路:題目中數組是1到n,為了方便演算法考慮,以及數組儲存方便,我們考慮0-n-1,結果是相同的。 考慮A[i],現在位置是i,如果採用A來計數,它的位置應該是A[i] % n,找到計數位置,該如何處理這個位置呢?加1嗎? 顯然不可以,這裡有一個技巧,就是加n,有兩個原因

加n可以保證A[i] % n是不變的
A數組,最後每一個元素表示為A[i] = x + k*n,其中x<n,並且k就是我們要統計的頻率。

這樣,大家也能夠明白,為什麼A[i]在A中的位置,表示為A[i] % n了吧。

【代碼】

#include <iostream>#include <malloc.h>#include <stdio.h>using namespace std;//統計數組重複元素個數void ArrayNumCount(int array[],int n){    int i;    if(n <= 0 || array == NULL){        return;    }    for(i = 0;i < n;i++){        array[i] *= n;    }    for(i = 0;i < n;i++){        array[array[i]/n]++;    }    for(i = 0;i < n;i++){        array[i] %= n;    }    //輸出    //array[0]儲存值為n的個數    int element;    for(i = 0;i < n;i++){        if(i == 0){            element = n;        }        else{            element = i;        }        printf("Element:%d Count:%d\n",element,array[i]);    }}int main() {    int array[] = {2,3,1,2,4,3,5,3,5,8};    ArrayNumCount(array,10);    return 0;}


代碼2:

#include <iostream>#include <malloc.h>#include <stdio.h>using namespace std;//統計數組重複元素個數void ArrayNumCount(int array[],int n){    int i;    if(n <= 0 || array == NULL){        return;    }    for(i = 0;i < n;i++){        array[array[i]%n]+=n;    }    //輸出    //array[0]儲存值為n的個數    int element,count;    for(i = 0;i < n;i++){        count = array[i] / n;        element = i;        if(i == 0){            element = n;        }        printf("Element:%d Count:%d\n",element,count);    }}int main() {    int array[] = {2,3,1,2,4,3,5,3,5,8,11};    ArrayNumCount(array,11);    return 0;}




C++面試題目 數組問題

0
 
解一道C語言題目,使用數組與指標統計成績 給定班級各學生各科的考試成績,要統計出各位同學的學期平均

使用指標變數實現統計學產生績的方法如下,如有不完全符合要求之處,請同學對程式稍加思考後修改。 #include <stdio.h> void main()
{void average(float *p,int n);
void search(float (*p)[4],int n);
float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};//假設題目有3名同學,每名同學有4門課
average(*score,12); //求12個分數的總平均分 。
search(score,2); //求序號為2的學生的成績
}
void average(float *p,int n)
{float *p_end; float sum=0,aver; p_end=p+n-1;
for(;p<=p_end;p++) sum=sum+(*p); aver=sum/n;
printf("average=%5.2f\n",aver);
}
void search(float (*p)[4],int n)// p是指向具有4個元素的一維數組的指標
{int i; printf("the score of No. %d are:\n",n);
for(i=0;i<4;i++) printf("%6.1f",*(*(p+n)+i)); }
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.