[LeetCode] 38. Count and Say 计数和读法

Posted 轻风舞动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 38. Count and Say 计数和读法相关的知识,希望对你有一定的参考价值。

The count-and-say sequence is the sequence of integers with the first five terms as following:

1.     1
2.     11
3.     21
4.     1211
5.     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 term of the count-and-say sequence.

Note: Each term of the sequence of integers will be represented as a string.

Example 1:

Input: 1
Output: "1"

Example 2:

Input: 4
Output: "1211"

Input Constraints:

1 <= n <= 30

对于前一个数,每一段相同元素的子数列数出相同元素的个数,然后这个子数组变为个数+数字,重复到结束。

解法: 迭代Iteration

Java:

public String countAndSay(int n) {
	if (n <= 0)
		return null;
 
	String result = "1";
	int i = 1;
 
	while (i < n) {
		StringBuilder sb = new StringBuilder();
		int count = 1;
		for (int j = 1; j < result.length(); j++) {
			if (result.charAt(j) == result.charAt(j - 1)) {
				count++;
			} else {
				sb.append(count);
				sb.append(result.charAt(j - 1));
				count = 1;
			}
		}
 
		sb.append(count);
		sb.append(result.charAt(result.length() - 1));
		result = sb.toString();
		i++;
	}
 
	return result;
} 

Java:

public class Solution {
    public String countAndSay(int n) {
	    	StringBuilder curr=new StringBuilder("1");
	    	StringBuilder prev;
	    	int count;
	    	char say;
	        for (int i=1;i<n;i++){
	        	prev=curr;
	 	        curr=new StringBuilder();       
	 	        count=1;
	 	        say=prev.charAt(0);
	 	        
	 	        for (int j=1,len=prev.length();j<len;j++){
	 	        	if (prev.charAt(j)!=say){
	 	        		curr.append(count).append(say);
	 	        		count=1;
	 	        		say=prev.charAt(j);
	 	        	}
	 	        	else count++;
	 	        }
	 	        curr.append(count).append(say);
	        }	       	        
	        return curr.toString();
        
    }
}

Python:

class Solution:
    # @return a string
    def countAndSay(self, n):
        seq = "1"
        for i in xrange(n - 1):
            seq = self.getNext(seq)
        return seq

    def getNext(self, seq):
        i, next_seq = 0, ""
        while i < len(seq):
            cnt = 1
            while i < len(seq) - 1 and seq[i] == seq[i + 1]:
                cnt += 1
                i += 1
            next_seq += str(cnt) + seq[i]
            i += 1
        return next_seq

Python: wo

class Solution(object):
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        s = ‘1‘
        i = 1
        while i < n:
            count = 1
            curr = s[0]
            news = ‘‘
            for j in xrange(1, len(s)):
                if curr == s[j]:
                    count += 1
                else:
                    news += str(count) + s[j-1]
                    curr = s[j]
                    count = 1
            news += str(count) + s[-1]        
            s = news    
            i += 1    
                
        return s    

C++:

class Solution {
public:
    string countAndSay(int n) {
        if (n <= 0) return "";
        string res = "1";
        while (--n) {
            string cur = "";
            for (int i = 0; i < res.size(); ++i) {
                int cnt = 1;
                while (i + 1 < res.size() && res[i] == res[i + 1]) {
                    ++cnt;
                    ++i;
                }
                cur += to_string(cnt) + res[i];
            }
            res = cur;
        }
        return res;
    }
};

  

  

  

 

 

 

 

以上是关于[LeetCode] 38. Count and Say 计数和读法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode题意分析&解答38. Count and Say

Leetcode38. Count and Say

LeetCode 38: Count and Say

[LeetCode 38] Count and Say

leetcode-38 Count And Say

LeetCode 38. Count and Say