算法收錄(持續(xù)更新)

這里會(huì)持續(xù)的發(fā)布我遇到過(guò)的算法題,歡迎在評(píng)論中一起探討這些算法的實(shí)現(xiàn)。

  • 當(dāng)前已經(jīng)編程實(shí)現(xiàn)函數(shù)int rand100(),該函數(shù)可以返回0~99的隨機(jī)整數(shù),且可以保證等概率。利用該函數(shù)實(shí)現(xiàn)int rand10000(),要求等概率返回0~9999的隨機(jī)整數(shù)

    int rand10000 {
        return 100 * rand100() + rand100();
    }
    

  • 湯姆現(xiàn)在要在家里舉辦宴會(huì),他有很多根長(zhǎng)度并不完全相同的筷子。現(xiàn)已知每根筷子的長(zhǎng)度,每個(gè)客人都能拿到兩根相同長(zhǎng)度的筷子,求宴會(huì)最多可以招待多少名賓客的函數(shù)實(shí)現(xiàn)int getMax(int arrLength[N])
  int getMax(int arrLength[N]) {
      assert(arrLength != NULL && N > 0)
      int count = 0;
      int maxLength = arrLength[0];

      for (int i = 1; i < N; i++) {
          if (maxLength < arrLength[i]) { maxLength = arrLength[i]; }
      }

      char * counter = (char *)malloc(sizeof(char) * (mexLength + 1));
      memset(counter, 0, mexLength+1)
      for (int i = 0; i < N; i++) {
          int idx = arrLength[i];
          if (counter[idx] == 0) {
              counter[idx] = 1;
          } else {
              count++;
              counter[idx] = 0;
          }
      }
      free(counter);
      return count;
  }

  • 現(xiàn)有一個(gè)整數(shù)序列,你可以交換其中任意兩個(gè)數(shù)以得到一個(gè)新序列,求共能得到多少種不同的序列(如果是3,3,3,3,那么無(wú)論怎么調(diào)換,都只存在一種序列)

  • 現(xiàn)有一個(gè)M行N列的數(shù)組,要求按照反向斜對(duì)角線(右上角->左下角)的方式進(jìn)行打印,編程實(shí)現(xiàn)int printMatrix[int arrMatrix[M][N]]
    下面案例的輸出順序?yàn)椋?-1-4-2-5-8-3-6-9-7-10-11
0 1 2 3
4 5 6 7
8 9 10 11

  • 假設(shè)北京和上海間有一趟專(zhuān)列,兩個(gè)車(chē)站每小時(shí)整點(diǎn)都會(huì)朝著對(duì)方發(fā)一輛車(chē)。已知北京->上海的列車(chē)全程需要13.5小時(shí);上海->北京的列車(chē)全程需要15.5小時(shí)。如果某人坐在其中一輛北京->上海的列車(chē),請(qǐng)問(wèn)途中會(huì)碰到多少輛迎面而來(lái)的列車(chē)

  • 存在有序整數(shù)數(shù)組Array,現(xiàn)已知整數(shù)T,實(shí)現(xiàn)算法existSum(array, T)求數(shù)組中是否存在兩個(gè)元素a + b = T,如果存在,輸出a和b在數(shù)組中的位置

    existSum(array: [Int], T: Int) -> (Int, Int)? {
        assert(array != nil)
        let mapper = [Int, Int]()
        let index = 0
        for index in 0..<array.count {
            if let idx = mapper[T - array[index]] {
                return (idx, index)
            }
            mapper[array[index]] = index
        }
        return nil
    }
    

  • 假設(shè)雞蛋從X層樓高度摔下來(lái)剛好會(huì)碎(X-1層不會(huì)碎),那么我們稱(chēng)雞蛋的臨界點(diǎn)是X-1。現(xiàn)在有一棟100層高的樓房,你有兩個(gè)雞蛋。請(qǐng)問(wèn)你如何進(jìn)行最少的試驗(yàn)得出這個(gè)雞蛋的臨界點(diǎn)?

    首先假設(shè)存在一個(gè)最大實(shí)驗(yàn)次數(shù)T,無(wú)論我們進(jìn)行怎樣的操作都不會(huì)大于這個(gè)T。最苦逼的情況下這個(gè)T等于99,即我們從第二層開(kāi)始一直試到第一百層,這樣毫無(wú)疑問(wèn)沒(méi)有任何的技巧性。 那么我們將這99次的實(shí)驗(yàn)次數(shù)分成多份來(lái)進(jìn)行測(cè)試,保證在分了之后仍然保證測(cè)試次數(shù)是最少的。那么我們假設(shè)第一次雞蛋扔在第T層,如果碎了,就從第一層開(kāi)始一層層往上實(shí)驗(yàn)。假設(shè)第T層雞蛋沒(méi)有碎,下一次就從T+T-1層開(kāi)始測(cè)試,如果雞蛋碎了從T+1開(kāi)始往上測(cè)試。于是我們得到了計(jì)算公式: T + T-1 + T-2 + T-3 + T-4 + .... + 2 + 1 >= 99 最終得出的T等于14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容