經典演算法(14) 騰訊2012年實習生筆試加分題

來源:互聯網
上載者:User

之前參加2012年騰訊實習生筆試時,在考場中遇到一道加分題,當時靈光一閃,直接揮筆就解決這道題目 。今天看到學校論壇上有師弟師妹們在詢問這題的解法,就寫篇部落格來分享我的解法吧,也歡迎大家討論其 它解法。

首先來看題目描述:

三 、加分題

28)給定一數組a[N],我們希望構造數組b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在構造過程中,不允許使用除法:

要求O(1)空間複雜 度和O(n)的時間複雜度;

除遍曆計數器與a[N] b[N]外,不可使用新的變數(包括棧臨時變數、堆 空間和全域靜態變數等);

實現程式(主流程式設計語言任選)實現並簡單描述。

這道題目最為 獨特的要求就是除去遍曆計算機外不能申請其它新的變數。怎麼解決了?首先不考慮這個條件,代碼如下:

// 騰訊2012年實習生筆試加分題  //http://blog.csdn.net/morewindows/article/details/8742666  //By MoreWindows( http://blog.csdn.net/MoreWindows )  #include <stdio.h>  void PrintfArray(int a[], int n)    {        for (int i = 0; i < n; i++)               printf("%5d ", a[i]);        putchar('\n');    }   int main()  {      printf("    騰訊2012年實習生筆試加分題  \n");      printf(" - http://blog.csdn.net/morewindows/article/details/8742666 -\n");      printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");                 const int MAXN = 5;      int a[MAXN] = {1, 3, 5, 7, 9};      int b[MAXN];                printf("數組a為:\n");      PrintfArray(a, MAXN);            b[0] = 1;      int i;      for (i = 1; i < MAXN; i++)          b[i] = b[i - 1] * a[i - 1];      int temp = 1;      for (i = MAXN - 2; i >= 0; i--)      {          temp *= a[i + 1];          b[i] *= temp;      }            printf("數組b為:\n");      PrintfArray(b, MAXN);      return 0;  }

解釋下代碼,設有數組大小為5。

對於第一個for迴圈

第一步:b[0] = 1;

第二步: b[1] = b[0] * a[0] = a[0]

第三步:b[2] = b[1] * a[1] = a[0] * a[1];

第四步:b[3] = b[2] * a[2] = a[0] * a[1] * a[2];

第五步:b[4] = b[3] * a[3] = a[0] * a[1] * a[2] * a [3];

然後對於第二個for迴圈

第一步

temp *= a[4] = a[4];

b[3] = b[3] * temp = a[0] * a[1] * a[2] * a[4];

第二步

temp *= a[3] = a[4] * a[3];

b[2] = b[2] * temp = a[0] * a[1] * a[4] * a[3];

第三步

temp *= a[2] = a[4] * a[3] * a[2];

b[1] = b[1] * temp = a[0] * a[4] * a[3] * a[2];

第四步

temp *= a[1] = a[4] * a[3] * a[2] * a[1];

b[0] = b[0] * temp = a[4] * a[3] * a[2] * a[1];

由此可以看出從b[4]到b[0]均已經 得到正確計算。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.