總結三道算法題和一道實操題

今天給你們總結幾道算法題,其中用到了一些不經常使用的技巧,但願你們和我同樣,也能收穫一些新東西。python

  • 有一個集合,其任意一個元素的對稱元素也必定存在於這個集合中,現隨機取出一個元素,求這個元素是誰算法

    • 剛看到這個題的時候我就想,確定不能用for循環的方式,不然這個題基本上是無心義的,那麼問題來了,我該用什麼方式,而後由於是集合因此我腦子裏又想出來用差集的方式。代碼以下:
    • s = {2, 4, 6, -6, -4, -2}
      s1 = s.copy()
      s1.pop()    # 這裏就是刪除一個元素,再刪除一個同樣的操做
      el = (s - s1)
    • 這樣子行嗎,我本身都懷疑我本身,不知道會不會這麼簡單或者不會這麼複雜,而後的而後我沒想出來其餘的方式,不事後來又知道了一種解法,代碼以下:
    • s = {2, 4, 6, -6, -4, -2}
          s1.pop()
          el = sum(s)*-1  # 根據對稱特性,相加等於零,那麼就這麼解答出來了

      親測了一下兩個的執行效率,幾乎是差很少的,不過求差集還會更快些。編程

  • 在一個列表中只有一個元素存在次數爲1,其餘都爲2,求這個元素app

    • 是否是又想到了for,雖然這種問題for能夠解決,可是和上一個問題同樣,我也以爲使用for是無心義的,那麼咱們應該怎麼解?請看代碼:
    • l = [1,2,1,3,4,5,3,4,5]
      
      from functools import reduce
      reduce(lambda x,y:x^y, l)
    1. reduce的使用方式很簡單:第一個參數是一個函數(這個函數只能有兩個參數),用來處理第二個參數(可迭代對象),第一次執行將第二個參數中前兩個元素做爲實參參入,而後接下來進入一個循環,將第一次的結果和第三個元素做爲實參傳入,依此類推...
    2. ^這個表示異或,對左右兩側數的二進制操做,最低位對其,相對的位如何數字不一樣(1對應0,或者0對應1)那麼結果爲1,不然爲0,因此自身異或自身爲0,利用這個特性完成了此題。還有邏輯與,邏輯或,邏輯與就是兩個二進制數據相對的位相同爲1,不一樣爲0;邏輯或就是兩個二進制數據相對的位不一樣爲1,相同爲0
  • 一層樓有10級臺階,能夠1次1級,2級,或3級的方式上樓,請問走完這10級臺階有幾種方式?編程語言

    • 這個問題我是有印象的,和斐波那契相似,我把他歸爲斐波那契變形,固然其實這種問題是屬於dp(動態規劃)的,我是不懂,因此過程提供給你們:
    • # 這段代碼來自我加入的一個交流羣的羣友
      l = [1,1,2]
      for i in range(3,11):
          l.append(l[i-1]+l[i-2]+l[i-3])  # 這種思惟是否是和斐波那契相似呢,大家能夠對比一下
      
      l[10]   # 274
  • 某次戰役中,爲便於信息交互,我軍偵察部門將這次戰役的關鍵高地座標設定爲(x=0,y=0)並規定,每向東增長100米,x加1,每向北增長100米,y加1。同時,我軍情報部門也破譯了敵軍向坦克發送的指揮信號,其中有三種信號(L,R,M)用於控制坦克的運動,L 和 R 分別表示使令坦克向左、向右轉向,M 表示令坦克直線開進100米,其它信號如T用於時間同步,P用於反轉信號,既出現p,後面的信號向左變爲向右,向右變爲向左,向前變爲向後,反之亦然。一日,我軍偵察兵發現了敵軍的一輛坦克,偵察兵當即將坦克所在座標(P, Q)及坦克前進方向(W:西,E:東,N:北,S:南)發送給指揮部,同時啓動信號接收器,將坦克接收到的信號實時同步發往指揮部,指揮部根據這些信息得以實時掌控了該坦克的位置,並使用榴彈炮精準地擊毀了該坦克。假設,偵察兵發送給指揮部的信息以下:坦克座標:(11,39)坦克運行方向:W,坦克接收到的信號爲:MTMPRPMTMLMRPRMTPLMMTLMRRMP,請經過編程計算出坦克所在的位置(編程語言不限)。函數

    • # 這段代碼來自我加入的一個交流羣的羣友
      import numpy
      
      class Tan():
          def __init__(self, x, y, w):
              w_type = {'E': 0, 'S': 1, 'W': 2, 'N': 3}
              self.point = numpy.array((x, y))
              self.w = w_type.get(w)
              self.c_type = [
                  numpy.array((1, 0)),
                  numpy.array((0, -1)),
                  numpy.array((-1, 0)),
                  numpy.array((0, 1)),
              ]
              self.P = 1
              self.t = (self.x,self.y)
          def command(self, c):
              if c == 'R':
                  self.w = (self.w + self.P) & 3
              elif c == 'L':
                  self.w = (self.w - self.P) & 3
              elif c == 'M':
                  self.point += (self.c_type[self.w] * self.P)
              elif c == 'P':
                  self.P *= -1
              elif c == 'T':
                  self.t=(self.x,self,y)
          def l_command(self, lc):
              for c in lc:
                  self.command(c)
      if __name__ == "__main__":
          tan = Tan(11, 39, 'W')
          tan.l_command('MTMPRPMTMLMRPRMTPLMMTLMRRMPTMMMMTP')
          print(tan.t)

經過每一個題都讓我學到了一種思惟,很不錯,有些問題咱們須要更多的去思索,查找最優方式,這樣才能鍛鍊咱們的大腦,一塊兒加油。code

相關文章
相關標籤/搜索