Leetcode No.38

本文作者分享了在实现外观数列(Count-and-Say sequence)过程中遇到的困难,从最初的计划使用函数调用来实现,到尝试使用递归但遇到错误,再到最终使用循环解决问题。作者还探讨了使用全局变量和数组属性存储中间结果的尝试,以及如何通过正则表达式优化递归解法。文章以Python和JavaScript的代码示例展示了整个过程,并反思了算法学习的重要性。
摘要由CSDN通过智能技术生成

在这里插入图片描述

JS 1

我最开始的想法就是这样,写一个求外观数的函数,然后在主函数里调用,但是写着写着就想用起递归,结果越写越错卡了半天最后还是妥协用了for循环。。。(被自己菜到)

/**
 * @param {number} n
 * @return {string}
 */
var Waiguan = function(origin) {
        let first = '';
        let count = 1;
        let result = "";
        for (let i = 0; i < origin.length; i++) {
            if (first !== origin[i]) {
                first = origin[i];
            }
            if (first == origin[i + 1]) {
                count++;
            } else {
                result = result + count + first;
                count = 1;
            }
        }
        return result;
}
var countAndSay = function(n) {
    let result = '1';
    if(n==1){
        return '1';
    }else{
       for(let i=0;i<n-1;i++){
           result=Waiguan(result);
        }
        return result;
    }
};

JS 2

因为递归出错,想用全局变量let一个数组来存每层的数最后取出来弥补,结果LeetCode用全局会出错,不知道这个坑啊,我还在vs测试了好几次,反复提交,直到看到LeetCode说不建议用全局。。。
狂交,以为出了bug
然后又想到歪门邪道给js的数组来个属性存值,结果直接LeetCode报错(vs可用)。

/**
 * @param {number} n
 * @return {string}
 */
let Waiguan = function(n,origin) {
        let first = '';
        let count = 1;
        let result = "";
        for (let i = 0; i < origin.length; i++) {
            if (first !== origin[i]) {
                first = origin[i];
            }
            if (first == origin[i + 1]) {
                count++;
            } else {
                result = result + count + first;
                count = 1;
            }
        }
        
        Waiguan(n,result);
        Waiguan.n.push(result);
}
Waiguan.n=[];

var countAndSay = function(n) {
    if(n==1){
        return '1';
    }else{
        Waiguan(n-1,'1');
        return Waiguan.n[0];
    }
};


JS 正宗递归!

var countAndSay = function(n) {
    if(n==1){
        return n.toString()
    }
    var tempArr = countAndSay(n-1).match(/(\d)\1*/g)  // 该正则进行相同分组,调用match方法得出接下来用的数组
    var result = ""
    tempArr.forEach((item)=>{              // 循环上面得到的数组,然后取每个的长度(题里说的几个),还有第一个数字(题里说的哪个数)
        var lth = item.length.toString()
        var num = item.substring(0,1)
        result = result+lth+num
    })
    return result   //最后返回结果
    
};

python

class Solution:
    def countAndSay(self, n: int) -> str:
        if n == 1:
            return '1'
        if n == 2:
            return '11'
        if n == 3:
            return '21'
    
        if n>3:
            s = '21'
            for i in range(n-3):
                val,c = s[0],1
                r = ''
                for j in range(1,len(s)):
                    if s[j] != val:
                        r += str(c)+val
                        val,c = s[j],1
                    else:
                        c += 1
                s = r + str(c)+val
            return s

经过一番洗礼,发现递归都写不明白了,真的得好好刷算法了,递归教我做人。。。QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值