外观数列(迭代实现)

    技术2023-11-23  99

    题目

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

    注意: 1、整数序列中的每一项将表示为一个字符串; 2、「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

    1 11 21 1211 111221

    第一项是数字 1; 描述前一项,这个数是 1 即 “一个 1 ”,记作 11; 描述前一项,这个数是 11 即 “两个 1 ” ,记作 21; 描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211; 描述前一项,这个数是 1211 即 “一个 1 一个 2 两个 1 ” ,记作 111221。

    示例 1: 输入: 4 输出: “1211” 解释:当 n = 3 时,序列是 “21”,其中我们有 “2” 和 “1” 两组,“2” 可以读作 “12”,也就是出现频次 = 1 而 值 = 2;类似 “1” 可以读作 “11”。所以答案是 “12” 和 “11” 组合在一起,也就是 “1211”。

    注意点

    每次遍历结束后都要再添加一次,避免最后一次结果丢失。(如n=4时,sn=21,循环只添加了“12”就结束循环,所以结束时需要将“11”添加到结果中)

    实现

    public String countAndSay(int n) { //n == 1,直接返回“1” if(n == 1) return "1"; String sn = "1"; for(int i = 2; i <= n; i ++){ int pre = 0; //记录开始节点,用于计算数字的个数 StringBuilder sb = new StringBuilder();//记录每一次的结果 int j = 0; for(; j < sn.length(); j ++){ if(sn.charAt(j) != sn.charAt(pre)){ //当前节点跟开始节点不同,则将个数和数字添加到 StringBuilder中 sb.append(j - pre).append(sn.charAt(pre)); //更新开始节点 pre = j; } } //遍历结束再添加一次,避免最后一次结果丢失 sb.append(j - pre).append(sn.charAt(pre)); //将结果存放再sn中 sn = sb.toString(); } return sn; }
    Processed: 0.013, SQL: 9