用Python跳出框框思考问题

本文是从我的个人博客中发布的。您可以在所有的辉煌中找到原始文章
http://motomastyle.com/thinking-outs...x-with-python/

介绍:
我最近遇到了
这个工作发布
在论坛中。它具有有趣的大脑预告片,作为应用的要求。大脑预告片被称为:"两个基本七代表不包含三个零的两个最大力量的指数是什么?"唯一的规定是申请人使用Python解决该问题。
我的最初方法:
我解决问题的态度是直率而直接的。我构建了三个函数,基本的数字,然后将其转换为七个底座,Hasthreezeros,它需要一个数字并检查它是否包含三个零,而FindwithOutzeros则是我程序的主要循环。我的问题的代码如下列出:

选择 | 换行 | 行号
  1. def BaseSeven(num):
  2.     powersOfSeven = 1;
  3.     res = 0;
  4.     while num / powersOfSeven > 6: powersOfSeven = powersOfSeven * 7
  5.     while powersOfSeven != 1:
  6.         res = res * 10 + int(num / powersOfSeven)
  7.         num = num - int(num / powersOfSeven) * powersOfSeven
  8.         powersOfSeven = powersOfSeven / 7
  9.     res = res * 10 + num
  10.     return res
  11.  
  12. def HasThreeZeros(num):
  13.     return str(num).find("000") != -1
  14.  
  15. def FindWithoutZeros(power):
  16.     lastWithoutThreeZeros = power
  17.     failures = -1
  18.     num = pow(2, power)
  19.     while failures <= lastWithoutThreeZeros:
  20.         if HasThreeZeros(BaseSeven(num)):
  21.            failures = failures + 1
  22.         else:
  23.             failures = 0
  24.             lastWithoutThreeZeros = power
  25.             print power
  26.         power = power + 1
  27.         num = num * 2
  28.         if (float(power) / 100) == int(power / 100): print "CheckPoint:", power
  29.     return lastWithoutThreeZeros
  30.  
  31. print FindWithoutZeros(1)

该解决方案既快速又脏,尽管严重缺乏优雅和速度。该解决方案的最大问题是该程序正在不断对大量数量进行算术操作。当指数爬到上几千座时,构建,转换和检查一个数字需要一分钟多的时间。
我对自己说:"没有必要这样做,有一种更好的方法来做到这一点。"
第2轮:
有了新的咖啡,我开始进一步分析问题。重读问题,我开始考虑两个权力的属性:最重要的属性是两个连续的功率是前一个的两倍。我知道这是一个相当惯例的结论,但是,意识到基本七个等效物将有效地有效地解决此问题的关键。
我开始构建一个名为Basesevennumber的课程。我给它一个名为Digits的列表,其元素将包含一个单个基础七位数。我构建了一个构造函数,将此列表初始化为[1],并且一个名为Double的成员函数将处理我的"指数"。我通过创建另一个成员(恰当地称为Hasthreezeros)来结束课程,以赋予我当前的数字状态。
双功能:
BaseSevennumber的双重功能将拥有及时解决此问题的关键。我没有在大量上进行一次算术操作,而是设计了第二个程序来对少数小数字执行许多算术操作。在列表中迭代,将每个数字列表中的每个数字加倍,并在第二次通过,执行所有基本七个进位操作。 Hasthreezeros函数现在可以快速穿越数字列表,并返回当前基本七个数字的适当状态。

选择 | 换行 | 行号
  1. class BaseSevenNumber:
  2.  
  3.     def __init__(self):
  4.         self.digits = [1]
  5.  
  6.     def Double(self):
  7.         for i in range(0, len(self.digits)):
  8.             self.digits[i] = self.digits[i] * 2
  9.         for i in range(len(self.digits) - 1, -1, -1):
  10.             if self.digits[i] > 6:
  11.                 self.digits[i] = self.digits[i] - 7
  12.                 if i == 0: self.digits.insert(0,1)
  13.                 else: self.digits[i - 1] = self.digits[i - 1] + 1
  14.  
  15.     def HasThreeZeros(self):
  16.         for i in range(0, len(self.digits) - 2):
  17.             if self.digits[i] == 0 and self.digits[i + 1] == 0 and self.digits[i + 2] == 0: return True
  18.         return False
  19.  
  20. def SolveRiddle(maxFailuresAssumeFound):
  21.     bsn = BaseSevenNumber()
  22.     failures = 0
  23.     power = 1
  24.     while failures < maxFailuresAssumeFound:
  25.         bsn.Double()
  26.         if bsn.HasThreeZeros(): failures = failures + 1
  27.         else:
  28.             failures = 0
  29.             print power
  30.         power = power + 1
  31.  
  32. SolveRiddle(10000)

我对自己解决问题的方式感到非常满意,我对代码进行了测试。在微薄的16秒内,它给了我我想要的答案。谈论使用错误的工具来工作;仅仅因为问题说"两个力量"和"基础七代表 n"并不意味着人们应该将自己限制在这些方法上。对问题的仔细分析可以使人们有效,优雅,快速地解决一些最棘手的问题。

# 回答1

Motoma-出色的解决方案! 我需要生产,但无法解决这个问题。 这是一种自上而下的方法:

选择 | 换行 | 行号
  1. def ConvDecToBaseVar(num, base):
  2.     if base > 10 or base < 2:
  3.         raise ValueError, 'The base number must be between 2 and 10.'
  4.     if num == 0: return '0'
  5.     ans = ''
  6.     while num != 0:
  7.         num, rem = divmod(num, base)
  8.         ans =  str(rem)+ans
  9.     return ans
  10.  
  11. def solve_test1(max):
  12.     for i in xrange(max, 0, -1):
  13.         if '000' not in ConvDecToBaseVar(2**i, 7):
  14.             return i
  15.         else:
  16.             print 'Checked power %s, FAILED TEST' % (i)

花了一段时间,但发现低于20000的最高数字是8833。它的效率不如您的效率。 现在我可以重新上班了。

# 回答2

那么,你得到了工作吗? :d
# 回答3

pffftt ...我从未申请过。 我没有python的经验:D

标签: python

添加新评论