一道题目想到的

昨天晚上陪人参加阿里的网络面试,看到一道题目,大概意思是:

由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网络编程》里面的一样!

以后要注意这些小问题了。能够加快解决问题的速度。


  1. 具体的数字不记得了,这个是我自己编的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章