一直以來,我都對'0'這個數字感到習以為常,'0'不就是代表沒有嘛,但當我遇到了下面這個程式設計題目時,我對'0'的意義有了新的認識,'0'的引進,絕對稱得上是計數方式的一次偉大的前進。
給定乙個正整數,返回它在 excel 表中相對應的列名稱。乍一看,這個題目應該是乙個十進位制與26進製的轉換的問題,但細細想來,這個題目用常規的轉換方法是無法實現的,因為a~z中是沒有對應'0'的這個值的,所以我們無法用'a0'來簡單地代表26這個值,而是用'z'這個字母來表示26,這個差異導致我們使用傳統的除26取餘的方法來構建答案會出錯,以下是我想出的兩種方法。例如,
1 -> a
2 -> b
3 -> c
...26 -> z
27 -> aa
28 -> ab
...
既然知道了列的不斷增加的法則,那麼我們可以用乙個迴圈來實現我們的求值
def inc(val):
carry = true
for i in range(len(val)-1,-1,-1):
if carry:
val[i] = chr(ord(val[i])+1)
if val[i] > 'z':
carry = true
val[i] = 'a'
else:
carry = false
if carry:
val.insert(0,'a')
def f(n):
val =
for i in range(n):
inc(val)
return "".join(val)
首先我們來分析分析一下這個題目求的究竟是什麼樣乙個結果,因為az分別表示的是126這26個值,所以我們實際上是要把乙個數n轉換成如下的形式
其中
caution:當我們計算a0的時候,不能夠直接用n模26,因為a0的最大值可以是26,所以我們應當多討論乙個特殊情況,即n mod 26 = 0 的情況,這時候a0是可以取z的。
我們再看n除以26(向下取整)的情況,因為我們的a0是可以取到26的,所以這時候要分兩種情況討論
case1: a0 ≠ 26
這時候我們可以直接繼續除下去而不產生錯誤
case2: a0=26
這時候我們要先減去殘留下來的1,繼續往下除才能避免出錯
所以我們的**如下
def int2col(n):
res = ""
while n > 0:
temp = n % 26
if temp != 0:
res = chr(ord('a')+temp-1) + res
n = int(n/26)
else:
res = 'z' + res
n = int((n-1)/26)
return res
我們在求a0的時候可以考慮先將n-1,這時候a0的範圍就從126變成了025,即變成了我們熟悉的26進製中每一位的表示方法,這時候我們只要再用n去模上26,就可以得到a0-1的值,從這裡我們可以方便地轉換為字母表示,同時n減去1後,我們也避免了一次除法過後末尾還留下乙個1的情況。實現的**如下:
def int2col2(n):
res = ""
while true:
n = n - 1
res = chr(ord('a')+n%26) + res
n = int(n / 26)
if n == 0:
break
return res
通過這個題目,我發現'0'的引入對於計數方式的確是乙個偉大的進步,它不僅擴充了「無」的表示,它還方便了我們對於各種進製之間的轉換,使得我們的計算更為簡單,使得我們的計算機在處理各種事情的時候能夠更加方便地運算,這確實是乙個不可小看的自然數。 乙個沒有 的for迴圈
如果for迴圈沒有 那麼該for迴圈預設對第一條語句進行迴圈,以 結尾就結束了。這個語法同樣適用於if while迴圈。例如下面這個例子 public class fordemo int s 0 for int i 0 i myintarray.length i if i 2 1 s myintar...
沒有物件?new乙個!
我們都知道,使用new後可返回乙個物件,通常用於例項化乙個 類 用法 function student name,age student.prototype.sayname function const person new student 小明 person.sayname i am 小明首先我們...
乙個沒有索引引起的問題
這個案例說來也很簡單。話說我們公司舊版本的 mediation 系統每天都需要從各個 network element ne 的伺服器上採集 cdr,採集程式一般都是用 expect 寫的,其實就是 ftp到對方的機器上拷貝檔案過來。ne裡的 cdr一般不會輕易做 house keep ftp登入之後...