leetcode 38. 报数

这题题目读起来很拗口, 所以差评好多的样子2333

题目的大意:

n==1 输出是1

n==2, 前一步, 输出的结果数字是由1个1组成的, 所以是11

n==3, 前一步, 输出的结果数字是11, 由2个1组成, 所以是21

n==4, 前一步, 输出的结果数字是21, 由1个2和1个1组成, 所以是1211

n==5, 前一步, 输出是1211, 由1个1, 1个2, 和2个1组成, 所以是111221

每个循环内是从做到右读数, 归纳由几个几组成

我的答案:

	 public String countAndSay(int n) {
		if(n==1) return "1";
		if(n==2) return "11";
		String str = "11";
		for(int i=3; i<n+1;i++){
			char last = str.charAt(0);
			int count=1;
			StringBuffer newStr =new StringBuffer();
			for(int j=1;j<str.length();j++){
				if(str.charAt(j)==last){
					count++;
				}else{
					newStr.append(count).append(last);
					last = str.charAt(j);
					count=1;
				}
			}
			newStr = newStr.append(count).append(last);
			str = newStr.toString();
		}
		return str;
	 }

两层循环

内层循环中, 比较当前遍历的数字和前一个是否相同: 相同, 则计数自增1; 否则, 临时字符串newStr append count个last

需要注意的是在遍历到j==str.length()-1的时候, 对于这最后一个字符的结果这层循环没有考虑进去, 所以在内层for结束时需要再添加一次newStr = newStr.append(count).append(last);

这里的临时字符串因为要多次添加, 所以使用StringBuffer比String要快

外层循环, 从3开始, 因为内层循环中是比较当前字符串和前一个字符串, 也就是内层循环默认了前一次结果str长度至少为2, n==1的时候是"1", n==2的时候第一次出现"11", 所以外层循环从3开始, 一直到n, 也就是i<n+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值