leetcode解题之外观数列

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

  1. 1
    
  2. 11
    
  3. 21
    
  4. 1211
    
  5. 111221 1 被读作  "one 1"  ("一个一") , 即 11。 11 被读作 "two 1s" ("两个一"), 即 21。 21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211。
    

给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

注意:整数序列中的每一项将表示为一个字符串。

示例 1:

输入: 1 输出: “1” 示例 2:

输入: 4 输出: “1211”

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/count-and-say
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处

读了好多遍题目没有读懂😅
思路是先对一个字符值进行计算知道他下一要出现的字符串,取出一个临时的值,遍历字符串找出和其不相等的值,计算当前保存的值出现的次数,然后重置临时值为当前值,重新计算,直至所有值计算完毕;最后使用递归的方式就可以了

public class CountAndSay {
    public String countAndSay(int n){
        if (n==1){
            return "1";
        }
        String ans="1";
       for (int i = 2;i<=n;i++){
        ans=countSameNum(ans);
       }
        return ans;
    }

    public String countSameNum(String s){
        String ans = "";
        List<String> list = new ArrayList<>();
        char tem = s.charAt(0);
        int start=0;
        for (int i=0;i<s.length();i++){
            if (s.charAt(i)!=tem){
                list.add(s.substring(start,i));
                start=i;
                tem=s.charAt(i);
            }
        }
        list.add(s.substring(start,s.length()));
        for (int j=0;j<list.size();j++){
           ans+=list.get(j).length()+list.get(j).substring(0,1);
        }
        return ans;
    }
    public static void main(String[] args) {
        CountAndSay cas = new CountAndSay();
//        System.out.println(cas.countSameNum("1"));
        System.out.println(cas.countAndSay(5));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值