IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]每个程序员1小时内必须解决的5个编程问题之多种方法

    caimouse发表于 2015-05-14 12:41:12
    love 0

    在这几天里,不断有各种方法涌现出来,下面就来贴上几个解决方法,如果按这些方法,真的不用一个小时就完工,关键要你想得到!

    下面是问题:

    问题3

    编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。

    问题4

    编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。

    问题5

    编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。

    后面是解决这些问题的一系列方案:

    解决问题3的代码:

    import math
    
    gr = (1 + math.sqrt(5)) / 2
    def fibonacci(n):
        return (math.pow(gr, n) - math.pow(1 - gr, n)) / math.sqrt(5)
    
    total = 0
    for i in range(0, 100):
        total = total + fibonacci(i)
    
    print(total)
    
    
    def f(n):
        if n == 0: return 0
        if n == 1: return 1
    
        return f(n-1) + f(n-2)
    
    print(f(100))
    
    
    def fib3(n):
        a, b = 0, 1
        for i in range(n):
            a, b = b, a+b
        return a
    
    print(fib3(100))
    这里共使用三种方法解决。

    解决问题4的两种方法:

    #python 3.4.3  win7
    #问题4
    #编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。
    
    #数字序列
    #NumList = [950, 201, 1, 9,980,99,909]
    NumList = [45,4,43, 45456,45452, 44, 445, 45]
    #找出能放到最高位数的最大数字
    def FindMaxNum(nlist):
        temp = []
        for i in nlist:
            numLen = len(str(i))
            temp.append(int(i/pow(10,numLen - 1)))
    
        tempSort = temp[:]
        tempSort.sort()
    
        for i in range(len(temp)):
            if temp[i] == tempSort[-1]:
                return i;
        return 0
    
    #相同位数的数字要进行值比较,取回最大值的。
    def FindValMax(index, nlist):
        last = nlist[index]
        count = len(str(last))
        
        for i in range(len(nlist)):
            if count == len(str(nlist[i])) and nlist[i] > last:
                last = nlist[i]
                index = i             
        return index
    
    #比较相邻值是否需要交换
    def ReSort(nlist):
        if len(nlist) < 2:
            return
    
        for i in range(len(nlist)-1):
            temp1 = nlist[i]
            temp2 = nlist[i+1]
            val1 = int(str(temp1) + str(temp2))
            val2 = int(str(temp2) + str(temp1))
            if val1 < val2:
                nlist[i], nlist[i+1] = nlist[i+1],nlist[i]
    
    #
    def main():
        temp = NumList[:]
        target = []
        while len(temp) > 0:
            index = FindMaxNum(temp)                
            index = FindValMax(index, temp)
            target.append(temp[index])
            
            del temp[index]
    
        #    
        print(target)
        i = 0
        while i < len(target):
            i += 1
            ReSort(target)
        print(target)
    
        print('###########################')
        print(large(NumList))
    #
    import functools
    def large( nums ):
      return ''.join(
          sorted( [str(n) for n in nums],
                  key=functools.cmp_to_key(lambda x,y:int(y+x)-int(x+y)) )
          )
    
    
    #入口函数
    if __name__ == "__main__":    
        main()    
        
    

    这种方法是最简单:

    #
    import functools
    def large( nums ):
      return ''.join(
          sorted( [str(n) for n in nums],
                  key=functools.cmp_to_key(lambda x,y:int(y+x)-int(x+y)) )
          )

    解决问题5的另外两种方法:

    #
    
    op = ('+', '-', '')
    for a in range(0,3):
      for b in range(0,3):
        for c in range(0,3):
          for d in range(0,3):
            for e in range(0,3):
              for f in range(0,3):
                for g in range(0,3):
                  for h in range(0,3):
                    lhs = '1'+op[a]+'2'+op[b]+'3'+op[c]+\
                          '4'+op[d]+'5'+op[e]+'6'+op[f]+\
                          '7'+op[g]+'8'+op[h]+'9'
                    res = eval( lhs )
                    if ( res == 100 ):
                      print( lhs+'=100')
    
    print('##################')
    
    def f( n, eq ):
      if n==10:
        if eval(eq)==100:
          print(eq + '=100')
        return
      f( n+1, eq+'+'+str(n) )
      f( n+1, eq+'-'+str(n) )
      f( n+1, eq+str(n) )  
    f(2, '1')
    

    只要多思考,还是有很多办法的。





沪ICP备19023445号-2号
友情链接