总结三道算法题和一道实操题

今天给你们总结几道算法题,其中用到了一些不经常使用的技巧,但愿你们和我同样,也能收获一些新东西。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

相关文章
相关标签/搜索