1. 程式人生 > >Leetcode 481.神奇字符串

Leetcode 481.神奇字符串

存在 ... 字符串 osi java 解釋 tco ring ntp

神奇字符串

神奇的字符串 S 只包含 ‘1‘ 和 ‘2‘,並遵守以下規則:

字符串 S 是神奇的,因為串聯字符 ‘1‘ 和 ‘2‘ 的連續出現次數會生成字符串 S 本身。

字符串 S 的前幾個元素如下:S = "1221121221221121122 ......"

如果我們將 S 中連續的 1 和 2 進行分組,它將變成:

1 22 11 2 1 22 1 22 11 2 11 22 ......

並且每個組中 ‘1‘ 或 ‘2‘ 的出現次數分別是:

1 2 2 1 1 2 1 2 2 1 2 2 ......

你可以看到上面的出現次數就是 S 本身。

給定一個整數 N 作為輸入,返回神奇字符串 S

中前 N 個數字中的 ‘1‘ 的數目。

註意:N 不會超過 100,000。

示例:

輸入:6

輸出:3

解釋:神奇字符串 S 的前 6 個元素是 "12211",它包含三個 1,因此返回 3。

分析題目,該字符串是唯一的,只含有1和2,且字符串前後存在依賴關系,由於其實固定的,所以我們可以生成前三位,然後從第三位開始一邊生成新的字符,一邊繼續遍歷該字符串,一直到滿足字符串的長度等於N,具體實現如下

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 class Solution {
 5     public
static int magicalString(int n) { 6 if(n==1) return 1; 7 int retData = 1; 8 List<Integer> dataList = new ArrayList<>(); 9 dataList.add(1); 10 dataList.add(2); 11 dataList.add(2); 12 if(n<=3){ 13 if(n <= 0){ 14 return
0; 15 } 16 return retData; 17 } 18 int currentPosition = 2; 19 while (dataList.size() < n){ 20 int needData = dataList.get(currentPosition); 21 int lastData = dataList.get(dataList.size() - 1); 22 if(lastData == 1){ 23 for(int i= 0; i<needData; i++){ 24 dataList.add(2); 25 } 26 } else { 27 for(int i= 0; i<needData; i++){ 28 dataList.add(1); 29 retData++; 30 } 31 } 32 currentPosition++; 33 } 34 if(dataList.size() > n && dataList.get(dataList.size()-1) == 1){ 35 retData--; 36 } 37 return retData; 38 } 39 }

Leetcode 481.神奇字符串