用Python跳出框框思考问题
本文是从我的个人博客中发布的。您可以在所有的辉煌中找到原始文章
http://motomastyle.com/thinking-outs...x-with-python/
。
介绍:
我最近遇到了
这个工作发布
在论坛中。它具有有趣的大脑预告片,作为应用的要求。大脑预告片被称为:"两个基本七代表不包含三个零的两个最大力量的指数是什么?"唯一的规定是申请人使用Python解决该问题。
我的最初方法:
我解决问题的态度是直率而直接的。我构建了三个函数,基本的数字,然后将其转换为七个底座,Hasthreezeros,它需要一个数字并检查它是否包含三个零,而FindwithOutzeros则是我程序的主要循环。我的问题的代码如下列出:
- def BaseSeven(num):
- powersOfSeven = 1;
- res = 0;
- while num / powersOfSeven > 6: powersOfSeven = powersOfSeven * 7
- while powersOfSeven != 1:
- res = res * 10 + int(num / powersOfSeven)
- num = num - int(num / powersOfSeven) * powersOfSeven
- powersOfSeven = powersOfSeven / 7
- res = res * 10 + num
- return res
- def HasThreeZeros(num):
- return str(num).find("000") != -1
- def FindWithoutZeros(power):
- lastWithoutThreeZeros = power
- failures = -1
- num = pow(2, power)
- while failures <= lastWithoutThreeZeros:
- if HasThreeZeros(BaseSeven(num)):
- failures = failures + 1
- else:
- failures = 0
- lastWithoutThreeZeros = power
- print power
- power = power + 1
- num = num * 2
- if (float(power) / 100) == int(power / 100): print "CheckPoint:", power
- return lastWithoutThreeZeros
- print FindWithoutZeros(1)
该解决方案既快速又脏,尽管严重缺乏优雅和速度。该解决方案的最大问题是该程序正在不断对大量数量进行算术操作。当指数爬到上几千座时,构建,转换和检查一个数字需要一分钟多的时间。
我对自己说:"没有必要这样做,有一种更好的方法来做到这一点。"
第2轮:
有了新的咖啡,我开始进一步分析问题。重读问题,我开始考虑两个权力的属性:最重要的属性是两个连续的功率是前一个的两倍。我知道这是一个相当惯例的结论,但是,意识到基本七个等效物将有效地有效地解决此问题的关键。
我开始构建一个名为Basesevennumber的课程。我给它一个名为Digits的列表,其元素将包含一个单个基础七位数。我构建了一个构造函数,将此列表初始化为[1],并且一个名为Double的成员函数将处理我的"指数"。我通过创建另一个成员(恰当地称为Hasthreezeros)来结束课程,以赋予我当前的数字状态。
双功能:
BaseSevennumber的双重功能将拥有及时解决此问题的关键。我没有在大量上进行一次算术操作,而是设计了第二个程序来对少数小数字执行许多算术操作。在列表中迭代,将每个数字列表中的每个数字加倍,并在第二次通过,执行所有基本七个进位操作。 Hasthreezeros函数现在可以快速穿越数字列表,并返回当前基本七个数字的适当状态。
- class BaseSevenNumber:
- def __init__(self):
- self.digits = [1]
- def Double(self):
- for i in range(0, len(self.digits)):
- self.digits[i] = self.digits[i] * 2
- for i in range(len(self.digits) - 1, -1, -1):
- if self.digits[i] > 6:
- self.digits[i] = self.digits[i] - 7
- if i == 0: self.digits.insert(0,1)
- else: self.digits[i - 1] = self.digits[i - 1] + 1
- def HasThreeZeros(self):
- for i in range(0, len(self.digits) - 2):
- if self.digits[i] == 0 and self.digits[i + 1] == 0 and self.digits[i + 2] == 0: return True
- return False
- def SolveRiddle(maxFailuresAssumeFound):
- bsn = BaseSevenNumber()
- failures = 0
- power = 1
- while failures < maxFailuresAssumeFound:
- bsn.Double()
- if bsn.HasThreeZeros(): failures = failures + 1
- else:
- failures = 0
- print power
- power = power + 1
- SolveRiddle(10000)
我对自己解决问题的方式感到非常满意,我对代码进行了测试。在微薄的16秒内,它给了我我想要的答案。谈论使用错误的工具来工作;仅仅因为问题说"两个力量"和"基础七代表 n"并不意味着人们应该将自己限制在这些方法上。对问题的仔细分析可以使人们有效,优雅,快速地解决一些最棘手的问题。