羅馬數字包含以下七種字元: i, v, x, l,c,d 和 m。
字元 數值
i 1v 5
x 10
l 50
c 100
d 500
m 1000
例如, 羅馬數字 2 寫做 ii ,即為兩個並列的 1。12 寫做 xii ,即為 x + ii 。 27 寫做 xxvii, 即為 xx + v + ii 。
通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 iiii,而是 iv。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 ix。這個特殊的規則只適用於以下六種情況:
i 可以放在 v (5) 和 x (10) 的左邊,來表示 4 和 9。
x 可以放在 l (50) 和 c (100) 的左邊,來表示 40 和 90。
c 可以放在 d (500) 和 m (1000) 的左邊,來表示 400 和 900。
給定乙個整數,將其轉為羅馬數字。輸入確保在 1 到 3999 的範圍內。
示例 1:
輸入: 3
輸出: "iii"
示例 2:
輸入: 4
輸出: "iv"
示例 3:
輸入: 9
輸出: "ix"
示例 4:
輸入: 58
輸出: "lviii"
解釋: l = 50, v = 5, iii = 3.
示例 5:
輸入: 1994
輸出: "mcmxciv"
解釋: m = 1000, cm = 900, xc = 90, iv = 4.
public string inttoroman
(int num)
else
if(num >=
900)
else
if(num >=
500)
else
if(num >=
400)
else
if(num >=
100)
else
if(num >=90)
else
if(num >=50)
else
if(num >=40)
else
if(num >=10)
else
if(num >=9)
else
if(num >=5)
else
if(num >=4)
else
if(num >=1)
}return sb.
tostring()
;}
其實可以仔細思考一下,這段**的問題:
public string inttoroman
(int num)
while
(num >=
900)
while
(num >=
500)
while
(num >=
400)
while
(num >=
100)
while
(num >=90)
while
(num >=50)
while
(num >=40)
while
(num >=10)
while
(num >=9)
while
(num >=5)
while
(num >=4)
while
(num >=1)
}return sb.
tostring()
;}
我們通過,while替代 if判斷,這樣就不用每次都從上判斷到下
改進後就解決了問題1
private
final
int[
] tennum =
newint
;private
final string[
] lmnum =
newstring
;public string inttoroman
(int num)}}
return sb.
tostring()
;}
我們通過定義一些常量,避免大量重複的邏輯判斷。
但是很明顯,改進二沒有任何的效能提公升,甚至還要差一丟丟,但是很美觀,可讀性強了很多
解題步驟:
演算法刷題ING
給定字串j代表石頭中寶石的型別,和字串s代表你擁有的石頭。s中每個字元代表了一種你擁有的石頭的型別,你想知道你擁有的石頭中有多少是寶石。j中的字母不重複,j和s中的所有字元都是字母。字母區分大小寫,因此 a 和 a 是不同型別的石頭。示例 輸入 j aa s aaabbbb 輸出 3class so...
演算法刷題(2)
題目一 對應gradientboosting tree演算法,以下說法正確的是 1.當增加最小樣本 個數,我們可以抵制過擬合 2.當增加最小樣本 個數,會導致過擬合 3.當我們減少訓練單個學習器的樣本個數,我們可以降低variance 4.當我們減少訓練單個學習器的樣本個數,我們可以降低bias a...
演算法刷題(7)
題目一 假定你使用svm學習資料x,資料x裡面有些點存在錯誤。現在如果你使用乙個二次核函式,多項式階數為2,使用懲罰因子c作為超參之一。當你使用較大的c c趨於無窮 則 a仍然能正確分類資料b 不能正確分類c 不確定d 以上均不正確解析 正確答案是 a,採用更大的c,誤分類點的懲罰就更大,因此決策邊...