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),所以第 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
整體思路就是來回遍歷上一次產生的字串,然後碰到相同的元素就統計個數,不同的時候輸出上乙個元素和它的計數。題目中給出的是1-9的一種特例。但是實際d的數值會干擾後面的數。
舉例(d=1)
1. 1
2. 11
3. 12
4. 1121
5. 122111
6. 112213
7. 12221131
8. 1123123111
9. 112213111213112
10.11221131132111311221
具體的操作網上這個題解法很多了,說乙個注意事項,這個點卡題很久。。就是在處理字串時候,將元素和計數拼接的時候,操作不當在提交oj的時候會出現第五組資料超時的報錯。錯誤操作如下:
str=str+s[j]
+to_string
(i);
或者
str=str+s[j]
;str=str+
to_string
(i);
上述兩種操作的不合適之處是在作字串拼接的時候都進行了兩次的定址操作。這樣的話就會慢很多,str本身就處於呼叫,拼接卻又呼叫一次,整體上來看,字串越長,不必要定址浪費的時間越多。
改進:只需要用+=
復合賦值運算子處理,就不會發生超時。如下:
str+
=s[j]
;str+
=to_string
(i);
完整**:#include
#include
using
namespace std;
const
int n =
1e4+10;
intmain()
s=str;str="";
//儲存到s用於下一次遍歷,str記得清空
} cout/用於輸出只是第1項和最後一項,第一項輸出不用經過上面的while,直接輸出。
}return0;
}
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...