【leetcode】String——Count and Say(38)

题目:

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.

总体的思路是:实现一个方法,根据输入的String,返回结果。题目要求最后的结果是第n个结果,那就初试的输入是1,进行n次方法计算。

针对方法有两个思路:

思路1:记录charAt(i),判断charAt(i)和charAt(i-1)是否相等,并更新count(向前比对,指针 i 每次+1)(最后要做结尾处理,当i遍历到末尾时,最后一个/串char并没有写入结果)

思路2:记录charAt(i),向后查是否和charAt(i)相等,记录count,最后移动指针 i = i + count; 

 (思路2的速度要比1快)

代码:

public String countAndSay(int n) {
	StringBuffer sb = new StringBuffer();
	sb.append("1");
	for(int i=1;i<n;i++){
		sb=getRe2(sb);
	}

	return sb.toString();
}

private StringBuffer getRe2(StringBuffer s){
	StringBuffer sb = new StringBuffer();
	for(int i=0;i<s.length();){
		int count =1;
		while(i+count<s.length()&&s.charAt(i+count)==s.charAt(i))
			count++;
		sb.append(count).append(s.charAt(i));
		i+=count;
	}
	
	return sb;
}

private StringBuffer getRe(StringBuffer s){
	if(s.length()==1)
		return new StringBuffer("1").append(s);
	StringBuffer re=new StringBuffer();
	int count=1;
	for(int i=1;i<s.length();i++){
		if(s.charAt(i)==s.charAt(i-1)){
			count++;
		}else{
			re.append(count+""+s.charAt(i-1));
			count=1;
		}
	}
	re.append(count+""+s.charAt(s.length()-1));
	return re;
}

小tips:基本上涉及到String多次append,使用StringBuffer更高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值