昨天晚上陪人参加阿里的网络面试,看到一道题目,大概意思是:
由1、2、3、4、5组成的数字中,大于23154且小于45132的数字有多少个?1
本意应该是让使用排列组合计算吧,我直接写了一个简单的程序解决了。忽然发现,其实有好多的题目是要求把一个数字的各个位置的数字提取出来的。于是今天又稍加归纳,写了一个通用的函数。内容如下:
def getDigitNum(num):
i = 0
while num > 0:
num = (int)(num / 10)
i = i+1
return i
def getDigit(num, n):
bit = getDigitNum(num)
n = bit - n + 1
den = 10 ** (n - 1)
return (int)(num / den) % 10
count = 0
a = [0] * 5
for i in range(12345, 54322):
if i > 23154 and i < 45132:
for j in range(getDigitNum(i)):
a[j] = getDigit(i, j + 1)
if sorted(a) == range(1, 6):
count = count + 1
print count
思路非常简单,将需要的位数移至个位(通过除法+取整),余10即可。
其实,这个思路如果不加总结的话,每次都可以想出来。但是,总结之后,以后碰到这个问题就不用再思考了。小问题记思路,大问题就写一个自己用的库吧,就像《Unix网络编程》里面的一样!
以后要注意这些小问题了。能够加快解决问题的速度。
- 具体的数字不记得了,这个是我自己编的。 ↩