0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于數組的求和

電子工程師 ? 來源:FPGA之旅 ? 作者:FPGA之旅 ? 2022-08-10 11:25 ? 次閱讀

數組是最基本的數據結構,關于數組的面試題也屢見不鮮,本文羅列了一些常見的面試題,僅供參考,如果您有更好的題目或者想法,歡迎留言討論。目前有以下18道題目,如果有好的題目,隨時更新。

數組求和

求數組的最大值和最小值

求數組的最大值和次大值

求數組中出現次數超過一半的元素

求數組中元素的最短距離

找出絕對值最小的元素

數組求和

給定一個含有n個元素的整型數組a,求a中所有元素的和??赡苣鷷X得很簡單,是的,的確簡單,但是為什么還要說呢,原因有二,第一,這道題要求用遞歸法,只用一行代碼。第二,這是我人生中第一次面試時候遇到的題,意義特殊。

分析

簡單說一下,兩種情況

1. 如果數組元素個數為0,那么和為0。

2. 如果數組元素個數為n,那么先求出前n - 1個元素之和,再加上a[n - 1]即可

代碼

// 數組求和int sum(int*a, int n){     return n == 0 ? 0 : sum(a, n -1) + a[n -1];}

求數組的最大值和最小值

給定一個含有n個元素的整型數組a,找出其中的最大值和最小值

分析

常規(guī)的做法是遍歷一次,分別求出最大值和最小值,但我這里要說的是分治法(Divide and couquer),將數組分成左右兩部分,先求出左半部份的最大值和最小值,再求出右半部份的最大值和最小值,然后綜合起來求總體的最大值及最小值。這是個遞歸過程,對于劃分后的左右兩部分,同樣重復這個過程,直到劃分區(qū)間內只剩一個元素或者兩個元素。

代碼

// 求數組的最大值和最小值,返回值在maxValue和minValuevoid MaxandMin(int *a, int l, int r, int& maxValue, int& minValue){    if(l == r) // l與r之間只有一個元素    {        maxValue = a[l] ;        minValue = a[l] ;        return ;    }
    if(l + 1 == r) // l與r之間只有兩個元素    {        if(a[l] >= a[r])        {            maxValue = a[l] ;            minValue = a[r] ;        }        else        {            maxValue = a[r] ;            minValue = a[l] ;        }        return ;    }
    int m = (l + r) / 2 ; // 求中點
    int lmax ; // 左半部份最大值    int lmin ; // 左半部份最小值    MaxandMin(a, l, m, lmax, lmin) ; // 遞歸計算左半部份
    int rmax ; // 右半部份最大值    int rmin ; // 右半部份最小值    MaxandMin(a, m + 1, r, rmax, rmin) ; // 遞歸計算右半部份
    maxValue = max(lmax, rmax) ; // 總的最大值    minValue = min(lmin, rmin) ; // 總的最小值}

求數組的最大值和次大值

給定一個含有n個元素的整型數組,求其最大值和次大值

分析

思想和上一題類似,同樣是用分治法,先求出左邊的最大值leftmax和次大值leftsecond,再求出右邊的最大值rightmax和次大值rightsecond,然后合并,如何合并呢?分情況考慮

1 如果leftmax > rightmax,那么可以肯定leftmax是最大值,但次大值不一定是rightmax,但肯定不是rightsecond,只需將leftsecond與rightmax做一次比較即可。

2 如果rightmax > leftmax,那么可以肯定rightmax是最大值,但次大值不一定是leftmax,但肯定不是leftsecond,所以只需將leftmax與rightsecond做一次比較即可。

注意

這種方法無法處理最大元素有多個的情況,比如3,5,7,7將返回7,7而不是7,5。感謝網友從無到有靠誰人指出。

代碼

// 找出數組的最大值和次大值,a是待查找的數組,left和right是查找區(qū)間,max和second存放結果void MaxandMin(int a[], int left, int right, int&max, int&second){    if(left == right)    {        max = a[left] ;        second =  INT_MIN;    }    elseif(left +1== right)    {        max = a[left] > a[right] ? a[left] : a[right] ;        second = a[left] < a[right] ? a[left] : a[right] ;    }    else    {        int mid = left + (right - left) /2 ;
        int leftmax ;        int leftsecond ;        MaxandMin(a, left, mid, leftmax, leftsecond) ;
        int rightmax ;        int rightsecond ;        MaxandMin(a, mid +1, right, rightmax, rightsecond) ;
        if (leftmax > rightmax)        {            max = leftmax ;            second = leftsecond > rightmax ? leftsecond : rightmax ;        }        else        {            max = rightmax ;            second = leftmax < rightsecond ? rightsecond : leftmax ;        }    }}

求數組中出現次數超過一半的元素

給定一個n個整型元素的數組a,其中有一個元素出現次數超過n / 2,求這個元素。據說是百度的一道題

分析

設置一個當前值和當前值的計數器,初始化當前值為數組首元素,計數器值為1,然后從第二個元素開始遍歷整個數組,對于每個被遍歷到的值a[i]

1 如果a[i]==currentValue,則計數器值加1

2 如果a[i] != currentValue, 則計數器值減1,如果計數器值小于0,則更新當前值為a[i],并將計數器值重置為1

代碼

// 找出數組中出現次數超過一半的元素int Find(int* a, int n){    int curValue = a[0] ;    int count = 1 ;
    for (int i = 1; i < n; ++i)    {        if (a[i] == curValue)            count++ ;        else        {            count-- ;            if (count < 0)            {                curValue = a[i] ;                count = 1 ;            }        }    }
    return curValue ;}

另一個方法是先對數組排序,然后取中間元素即可,因為如果某個元素的個數超過一半,那么數組排序后該元素必定占據數組的中間位置。

求數組中元素的最短距離

給定一個含有n個元素的整型數組,找出數組中的兩個元素x和y使得abs(x - y)值最小

分析

先對數組排序,然后遍歷一次即可

代碼

int compare(const void* a, const void* b)
{
    return *(int*)a - *(int*)b ;
}

// 求數組中元素的最短距離void MinimumDistance(int* a, int n)
{
    // Sort    qsort(a, n, sizeof(int), compare) ;

    int i ; // Index of number 1    int j ; // Index of number 2
    int minDistance = numeric_limits::max() ;
    for (int k = 0; k < n - 1; ++k)
    {
        if (a[k + 1] - a[k] < minDistance)
        {
            minDistance = a[k + 1] - a[k] ;
            i = a[k] ;
            j = a[k + 1] ;
        }
    }

    cout << "Minimum distance is: " << minDistance << endl ;
    cout << "i = " << i << " j = " << j << endl ;
}

找出絕對值最小的元素

給定一個有序整數序列(非遞減序),可能包含負數,找出其中絕對值最小的元素,比如給定序列 -5, -3, -1, 2, 8 則返回1。

分析

由于給定序列是有序的,而這又是搜索問題,所以首先想到二分搜索法,只不過這個二分法比普通的二分法稍微麻煩點,可以分為下面幾種情況

如果給定的序列中所有的數都是正數,那么數組的第一個元素即是結果。

如果給定的序列中所有的數都是負數,那么數組的最后一個元素即是結果。

如果給定的序列中既有正數又有負數,那么絕對值得最小值一定出現在正數和負數的連接處。

為什么?因為對于負數序列來說,右側的數字比左側的數字絕對值小,如上面的-5, -3, -1, 而對于整整數來說,左邊的數字絕對值小,比如上面的2, 8,將這個思想用于二分搜索,可先判斷中間元素和兩側元素的符號,然后根據符號決定搜索區(qū)間,逐步縮小搜索區(qū)間,直到只剩下兩個元素。

代碼

單獨設置一個函數用來判斷兩個整數的符號是否相同

bool SameSign(int a, int b){    if (a * b > 0)        return true;    else        return false;}

// 找出一個非遞減序整數序列中絕對值最小的數int MinimumAbsoluteValue(int* a, int n){    // Only one number in array    if (n ==1)    {        return a[0] ;    }
    // All numbers in array have the same sign    if (SameSign(a[0], a[n -1]))    {        return a[0] >=0? a[0] : a[n -1] ;    }
    // Binary search    int l =0 ;    int r = n -1 ;
    while(l < r)    {        if (l + 1 == r)        {            return abs(a[l]) < abs(a[r]) ? a[l] : a[r] ;        }
        int m = (l + r) /2 ;
        if (SameSign(a[m], a[r]))        {            r = m;            continue;        }        else        {            l = m ;            continue;        }    }}
審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4671

    瀏覽量

    67767
  • 數據結構
    +關注

    關注

    3

    文章

    568

    瀏覽量

    40030
  • 數組
    +關注

    關注

    1

    文章

    411

    瀏覽量

    25821
收藏 人收藏

    評論

    相關推薦

    C語言中指針數組數組指針的區(qū)別

    指針和數組之間存在著緊密的關系。在本文中,我們將探討指針和數組的關系、指針算術和數組遍歷、多維數組與指針以及指針數組
    發(fā)表于 08-17 15:29 ?363次閱讀

    關于數組求和的問題

    數組求和為什么是0 呢
    發(fā)表于 09-23 10:03

    一個一維數組怎么實現相鄰元素相減后求和?

    小白求助大神,一個64元素的一維數組想要實現第二個元素減第一個元素,第三減第二,第四減第三……第64減第63,最后 第一個元素減第64個元素得到共64個差值,然后64個差值再求和,得到一個差值和。求大神幫忙寫個vi,萬分感謝。
    發(fā)表于 06-29 10:00

    VB數組的使用

    實驗六  數組的使用 一、實驗目的    (1)掌握數組的聲明和數組元素的引用。    (2)掌握固定數組和動
    發(fā)表于 09-23 19:28 ?5914次閱讀

    數組的知識

    互聯(lián)網JAVA其中一片內容將關于數組的知識,
    發(fā)表于 08-15 19:03 ?18次下載

    關于 Java 數組的 12 個最佳方法

    下文加介紹的是stackoverflow中關于數組方法的相關問題中,獲得最多票數的12個數組操作方法。
    發(fā)表于 01-29 09:45 ?867次閱讀

    Java創(chuàng)建數組的幾種方式及區(qū)別

    本文主要詳細介紹了關于Java創(chuàng)建數組的幾種方式。
    發(fā)表于 01-29 10:40 ?3779次閱讀

    指針數組數組指針的區(qū)別

    這里我們區(qū)分兩個重要的概念:指針數組數組指針。
    的頭像 發(fā)表于 06-29 15:30 ?1.9w次閱讀
    指針<b class='flag-5'>數組</b>和<b class='flag-5'>數組</b>指針的區(qū)別

    Keil使用結構體數組的奇怪問題

    今天用keil的時候發(fā)現一個很奇怪的點,是關于結構體數組的。首先說明我的keil版本是:V5.28.0.0問題是這樣的:我在a.h文件定義了一個結構體,然后在a.c中初始化了一個結構體數組,結構體
    發(fā)表于 11-21 16:36 ?3次下載
    Keil使用結構體<b class='flag-5'>數組</b>的奇怪問題

    二維數組數組指針以及指針數組

    二維數組數組指針以及指針數組
    的頭像 發(fā)表于 08-16 09:02 ?2499次閱讀

    關于數組常見的面試題

    數組是最基本的數據結構,關于數組的面試題也屢見不鮮,本文羅列了一些常見的面試題,僅供參考。目前有以下18道題目。
    的頭像 發(fā)表于 08-17 09:25 ?1527次閱讀

    變長數組和動態(tài)數組區(qū)別

    動態(tài)數組是指在聲明時,沒有確定數組大小的數組,它可以隨程序需要而重新指定大小。動態(tài)數組的內存空間是從堆動態(tài)分配的,當程序執(zhí)行到我們編寫的分配語句時,才為其分配存儲空間。
    的頭像 發(fā)表于 09-28 15:20 ?1764次閱讀

    unpacked數組和packed數組的主要區(qū)別

    unpacked數組和packed數組的主要區(qū)別是unpacked數組在物理存儲時不能保證連續(xù),而packed數組則能保證在物理上連續(xù)存儲。
    的頭像 發(fā)表于 10-18 09:13 ?2501次閱讀

    C 語言數組的基本結構

    數組是最基本的數據結構,關于數組的面試題也屢見不鮮,本文羅列了一些常見的面試題,僅供參考。目前有以下18道題目。 數組求和
    的頭像 發(fā)表于 06-22 10:56 ?505次閱讀

    數組的定義 什么是數組

    數組 數組是內置類型,是一組同類型數據的集合,它是值類型,通過從0開始的下標索引訪問元素值。 在初始化后長度是固定的,無法修改其長度。當作為方法的參數傳入時將復制一份數組而不是引用同一指針。
    的頭像 發(fā)表于 10-09 09:39 ?1716次閱讀