法学习6(题解)

算法学习6(题解)

本人博客

1.题目

「外观数列」是一个数位字符串序列,由递归公式定义:

  • countAndSay(1) = “1”
  • countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。

行程长度编码(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。例如,要压缩字符串"3322251",我们将"33""23"替换,将"222""32"替换,将"5""15"替换并将"1""11"替换。因此压缩后字符串变为"23321511"

给定一个整数n ,返回 外观数列的第n个元素(1 <= n <= 30)。

2.实例

实例一

输入:n = 4
输出:"1211"
解释:
countAndSay(1) = "1"
countAndSay(2) = "1" 的行程长度编码 = "11"
countAndSay(3) = "11" 的行程长度编码 = "21"
countAndSay(4) = "21" 的行程长度编码 = "1211"

3.代码

鄙人的:

public class Practice10 {
    public String countAndSay(int n) {
        String a = "1", temp = "";
        int count = 1;
        for(int i = 1;i < n;i++){
        //人为掠过此种情况
            if(i == 1){
                a = "11";
                continue;
            }
            // 对s1遍历处理获取值
            for(int j = 0;j < a.length()-1;j++){
            // 设定计数器 计算同一个数字出现的次数 count
                if(a.charAt(j) == a.charAt(j+1)){
                    count++;
                    //末位数字处理
                    if(j == a.length()-2){
                        temp += count+""+a.charAt(j);
                        break;
                    }
                }else{
                	// 不符合,记录下
                    temp += count+""+a.charAt(j);
                    count = 1;
                }
                //末位数字处理
                if(j == a.length()-2){
                    temp += 1+""+a.charAt(j+1);
                }
            }
            //归零
            a = temp;
            temp = "";
            count = 1;
        }

        return a;
    }

大佬的

    public String countAndSay(int n) {
        // 递归出口
        if(n==1){
            return "1";
        }
        // 假设我们获得上一次的结果为 s1 = 112213
        String s1 = countAndSay(n - 1);
        // 定义结果
        StringBuilder result = new StringBuilder();
        // 对s1遍历处理获取值
        char local = s1.charAt(0);
        int count = 0;
        for (int i = 0; i < s1.length(); i++) {
            // 设定计数器 计算同一个数字出现的次数 count
            if(s1.charAt(i) == local){
                count++;
            }else {
                // 不符合,记录下
                result.append(count);
                result.append(local);
                count = 1;
                local = s1.charAt(i);
            }
        }
        result.append(count);
        result.append(local);
        return result.toString();
    }

作者:桂继宏
来源:力扣(LeetCode

4.思路

鄙人的用的迭代,代码十分臃肿; 大佬用的递归——相当于代替了迭代的外层循环,也避免的很多特殊情况。

  1. 两种方法都是通过count计数,直到遇到不同的数字就进行记录,区别在于我是对n中两两挨着的数字进行比较,所以就出现了数组索引越界的问题:在对s1遍历处理获取值之前,小于两位的数字需要额外手动处理、在对s1遍历处理获取值中末位数字也需要分开处理;
  2. 而另一种方法通过依次遍历比较则很好的避免了这些问题,在处理末位数字时也只需要在循环结束后再进行一次赋值;
  3. 赋值时我用的字符串加减,而第二种用api,区别不大。
char local = s1.charAt(0);
int count = 0;
// 对s1遍历处理获取值
for (int i = 0; i < s1.length(); i++) {
if(s1.charAt(i) == local){
    count++;
}else {
	//result.append(count);
    //result.append(local);
    count = 1;
    local = s1.charAt(i);
    }
}

以上题目及实列代码均来自于:力扣(LeetCode)

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值