一道題目想到的

昨天晚上陪人蔘加阿里的網絡面試,看到一道題目,大概意思是:

由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. 具體的數字不記得了,這個是我自己編的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章