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:
Solution of this problem is strait forward, i.e. utilizing iteration to implement the rule of "count-and-say".
To be specific, when we are constructing the current sequence, we read the previous sequence. Two types of information need to be read: "what number is it" and "how many times it continually repeated". When a new number read, we add this information to the current sequence and reset the "what number is it" and "how many times it continually repeated". We continue this process till all number of the previous sequence read.
public class Solution {
public static String countAndSay(int n) {
if(n<1) return "";
if(n==1) return "1";
StringBuffer pre = new StringBuffer("1"); // 1st sequence
StringBuffer curr = null; // ith current sequence
for(int i=2; i<=n; i++){ // cualculate the following sequences
curr = new StringBuffer();
char digit = pre.charAt(0); // current countering digit
int dupCount = 0; // counter for repeating numbers
for(int j=0; j<pre.length(); j++){ // read the previous sequence
if(digit == pre.charAt(j)) dupCount++;
else{// a new number read
// add the previous number read
curr.append(dupCount);
curr.append(digit);
// reset counter for new digit
digit = pre.charAt(j);
dupCount = 1; // 1 is for the current digit
}
}
if(dupCount != 0){ // last part of the sequence (the last number reached)
curr.append(dupCount);
curr.append(digit);
}
// after current sequence constructed, set it as previous sequence and process next one
pre = curr;
}
return curr.toString();
}
}