• Leetcode-Count and Say


    The count-and-say sequence is the sequence of integers beginning as follows:
    1, 11, 21, 1211, 111221, ...

    1 is read off as "one 1" or 11.
    11 is read off as "two 1s" or 21.
    21 is read off as "one 2, then one 1" or 1211.

    Given an integer n, generate the nth sequence.

    Note: The sequence of integers will be represented as a string.

    Analysis:

    The rule is:

    1 -> 11

    2 -> 12

    3 -> 13

    11 -> 21

    22 -> 22

    33 -> 23

    111 -> 31

    222 -> 32

    333 -> 33

    Solution:

     1 public class Solution {
     2     public String countAndSay(int n) {
     3         String curStr = "";
     4         if (n==0) return curStr;
     5         curStr="1";
     6         if (n==1) return curStr;
     7 
     8         for (int i=2;i<=n;i++){
     9             String newStr = "";
    10             int len = curStr.length();
    11             int index = 0;
    12             while (index<len){
    13                 char cur = curStr.charAt(index);
    14                 index++;
    15                 if (cur=='1') {
    16                     if (index+1<len && curStr.charAt(index)=='1' && curStr.charAt(index+1)=='1'){
    17                         newStr += "31";
    18                         index += 2;
    19                     } else if (index<len && curStr.charAt(index)=='1'){
    20                         newStr += "21";
    21                         index++;
    22                     } else newStr += "11";
    23                 } else if (cur=='2'){ 
    24                     if (index+1<len && curStr.charAt(index)=='2' && curStr.charAt(index+1)=='2'){
    25                         newStr += "32";
    26                         index += 2;
    27                     } else if (index<len && curStr.charAt(index)=='2'){
    28                         newStr += "22";
    29                         index++;
    30                     } else newStr += "12";
    31                 } else {
    32                     if (index+1<len && curStr.charAt(index)=='3' && curStr.charAt(index+1)=='3'){
    33                         newStr += "33";
    34                         index += 2;
    35                     } else if (index<len && curStr.charAt(index)=='3'){
    36                         newStr += "23";
    37                         index++;
    38                     } else newStr += "13";
    39                 }
    40             }
    41             curStr = newStr;
    42         }
    43 
    44         return curStr;       
    45     }
    46 }

     Solution 2:

    Solution 1 is a naive solution. Even though the number in the string cannot exceed 4, we should figure out a general solution.

     1 public class Solution {
     2     public String countAndSay(int n) {
     3         String res = "1";
     4         for (int i=2;i<=n;i++){            
     5             int index = 0;
     6             StringBuilder buf = new StringBuilder();
     7             while (index<res.length()){
     8                 int count = 1;
     9                 int index2 = index+1;
    10                 while (index2<res.length() && res.charAt(index2)==res.charAt(index)){
    11                     index2++;
    12                     count++;
    13                 }
    14 
    15                 buf.append((char)(count+'0'));
    16                 buf.append(res.charAt(index));
    17                 index = index2;
    18             }
    19             res = buf.toString();
    20         } 
    21 
    22         return res;
    23     }   
    24 }
  • 相关阅读:
    hgoi#20191101
    hgoi#20191031
    hgoi#20191030
    hgoi#20191029-2
    RMQ (Range Minimum/Maximum Query)
    数学浅谈-组合数与数学期望
    重庆NK十日行-知识点汇总
    分块
    STL—algorithm与Map容器
    搜索—迭代加深
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4129937.html
Copyright © 2020-2023  润新知