1084 外觀數列 20 分

2021-09-24 01:42:08 字數 3091 閱讀 3125

題意描述:

外觀數列是指具有以下特點的整數序列:

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...