今早心血来潮想找一条easy题刷一下,就找了个字符串的题目:https://leetcode.com/problems/count-and-say/
这个题目虽然是easy题目,但题意理解起来需要一会儿呢。
就是说对于每个整数(1,2,...,n)对应的字符串,我们要给字符串进行”连续相同字符“计数count,然后把count转为字符与对应字符连接,举个n=4的例子:n=3的结果是”1211“,我们开始计数:”1211“从左往右由1个”1“、1个”2“、2个”1“组成,结果是”111211“,哈哈哈,四不四蛮有趣的!!!
刚刚的过程转化为算法还是比较简单的,外循环控制n,内循环相当于双指针问题,这里不详细描述算法了,:
class Solution {
public static String countAndSay(int n) {
String ret="1";
for(int i=1;i<n;i++)
{
String ans="";
int k=0;
while(k<ret.length())
{
int j=k+1;
char c=ret.charAt(k);
while(j<ret.length() && ret.charAt(j)==c)
j++;
ans += (Integer.toString(j-k)+c);
k=j;
}
ret=ans;
}
return ret;
}
}
这个算法用到了immutable的String,效率果然很低:
看了Discussion里面有一个的递归解法,思路跟我这个差不多,但是StringBuilder的性能表现要比String好:
class Solution {
public String countAndSay(int n) {
if(n == 1){
return "1";
}
return read(countAndSay(n-1));
}
private String read(String s){
StringBuilder sb = new StringBuilder();
int count = 1;
char c = s.charAt(0);
for(int i = 1; i < s.length(); i++){
if(c == s.charAt(i)){
count++;
}else{
sb.append(count).append(c);
c = s.charAt(i);
count = 1;
}
}
sb.append(count).append(c);
return sb.toString();
}
}