題意描述:
外觀數列是指具有以下特點的整數序列:
d, d1, d111, d113, d11231, d112213111, ...
它從不等於 1 的數字 d 開始,序列的第 n+1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個 d,所以就是 d1;第 2 項是 1 個 d(對應 d1)和 1 個 1(對應 11),所以第 3 項就是 d111。又比如第 4 項是 d113,其描述就是 1 個 d,2 個 1,1 個 3,所以下一項就是 d11231。當然這個定義對 d = 1 也成立。本題要求你推算任意給定數字 d 的外觀數列的第 n 項。
輸入格式:
輸入第一行給出 [0,9] 範圍內的乙個整數 d、以及乙個正整數 n(≤ 40),用空格分隔。
輸出格式:
在一行中給出數字 d 的外觀數列的第 n 項。
輸入樣例:
1 8
輸出樣例:
1123123111
解題思路:mara: 複雜,o((⊙﹏⊙))o
jack:再複雜也是簡單的疊加,拆開來看唄。外觀描述,就是好像那個啥壓縮演算法一樣,好像是行程壓縮編碼,就是這個樣子。將連續的數字用數字和計數來編碼。比如說「1111000」 =》「1403」。
mara: 讓我推一推,像題目裡面描述的如果d是1的話,那應該是:
1
1112
1121
122111
112213
12221131
1123123111
還真是這樣的,統計連續出現的相同數字的個數。hiahiahia
jack: 然後這道題還有乙個迭代的過程,用迴圈寫就好了。
mara: 那是不是還能用遞迴寫啊,怎麼不用遞迴啊,遞迴不是好寫嗎?
jack: 我不太會寫遞迴的,(✿◡‿◡),就用迴圈吧。然後 n 是 1 的話特殊處理一下, n不是 1 的時候,從第一項 變到 第n項, 一共需要 n - 1步。
mara: ♪ d(^^*) 迴圈比遞迴跑的快呀,就用迴圈吧。
jack: 好(^ o ^)/~
**:
def
main()
: d, n =
(int
(x)for x in
input()
.split())
# 接收整數d,範圍是[0,9]以及乙個正整數 n(≤ 40)。
previous =
str(d)
# 將數字d變成字串形式,便於後續處理。
if n >1:
# 如果求得是 外觀數列的 第2項或者任何後邊的項。
for x in
range
(n -1)
:# 第一項與第n項之間的間隔是n-1,即只需要迭代n-1次。
result = out_look(previous)
# 迭代一次, result就是對previous的外觀描述。
previous = result
# 將一次迭代的結果再次進行迭代。
else
:# 如果求得是外觀數列的第一項,其實就是整數d自身。
result = previous
print
(result)
# 輸出答案
defout_look
(previous)
:"""
返回對previous的外觀描述,輸入為字串,輸出為字串。
"""element = previous[0]
# 取出previous 的第一項作為起始元素
index =
0 count =
1# index 指示當前位置, count 指示截止到當前位置element 元素共有多少。
answer =
""# answer儲存最終的 外觀描述
while
true
:# 我們在內部做判斷,然後break出去。為什麼這樣做呢?因為在迴圈的內部我們
# 需要試探著向後尋找同element相等的元素,而試探首先要保證不會造成陣列
# 越界。當然,這點可能不是一下子就能想到的。也就是說將判斷放在迴圈內部是
# 優化後的程式結構。
index +=
1# 試探著向後看
if index <
len(previous)
:# 沒有越界,可以看
if previous[index]
== element:
count +=
1# element元素在重複,count記下數就可以了
else
:# 新的element已經出現,將舊的element和出現的次數記好
answer +=
"{}{}"
.format
(element, count)
element = previous[index]
count =
1# 新的element和新的count
else
: answer +=
"{}{}"
.format
(element, count)
# 不能再向後了,後面已經沒有元素了。記錄一下最後乙個index和count
break
# 然後終止迴圈
return answer
# 返回答案
if __name__ ==
'__main__'
: main(
)
易錯點:總結:summer breeze
1084 外觀數列(20 分)
外觀數列是指具有以下特點的整數序列 d,d1,d111,d113,d11231,d112213111,它從不等於 1 的數字d開始,序列的第 n 1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個d,所以就是d1 第 2 項是 1 個d 對應d1 和 1 個 1 對應 11 所以第 ...
1084 外觀數列 20 分
外觀數列是指具有以下特點的整數序列 d,d1,d111,d113,d11231,d112213111,它從不等於 1 的數字 d 開始,序列的第 n 1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個 d,所以就是 d1 第 2 項是 1 個 d 對應 d1 和 1 個 1 對應 1...
1084 外觀數列 20 分
外觀數列是指具有以下特點的整數序列 d,d1,d111,d113,d11231,d112213111,它從不等於 1 的數字 d 開始,序列的第 n 1 項是對第 n 項的描述。比如第 2 項表示第 1 項有 1 個 d,所以就是 d1 第 2 項是 1 個 d 對應 d1 和 1 個 1 對應 1...