Leetcode 481.神奇字符串
阿新 • • 發佈:2019-02-14
存在 ... 字符串 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 publicstatic 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 return0; 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.神奇字符串