Javascript算法练习(一)

本文介绍了两种JavaScript反转字符串的方法,包括使用split()、unshift()和join(),以及利用二分法。同时,讨论了经典阶乘问题的解决,包括递归和迭代实现,并预告了缓冲方式的实现。此外,文章还提到了一个初步的回文判断方法,计划进一步优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Javascript算法练习(一)

反转字符串

  • 方法一:split() + unshift() + join()

    // 将__string反转返回
    function myReverse ( __string ) {
    
        if ( !__string ) return;
    
        var aTarget     = __string.split(""),   // 将__string分割成单个字符,保存到数组中
            aTmp        = [],                   // 存放反转之后的字符串数组
            iLen        = aTarget.length;       // __string数组长
    
        for ( var i = 0; i < iLen; i++ ) {
            aTmp.unshift( aTarget[i] ); // 头部插入,压栈方式
        }
    
        return aTmp; 
    }
    
    console.log( myReverse( "Hello World!") );
    // reverse.html:30 ["!", "d", "l", "r", "o", "W", " ", "o", "l", "l", "e", "H"]
    
    console.log( myReverse( "Hello World!").join("") );     // 组合成字符串
    // reverse.html:33 !dlroW olleH
    
  • 方法二:split() + 二分法

    function dichotomy( __string ) {
        if ( !__string ) return;
    
        var iTmp    = 0,
            aTarget = __string.split(""),   // 转换成字符数组
            iLen    = aTarget.length,
            sTmp    = "";
    
        // 遍历数组,头尾交换
        for ( var i = 0; i < iLen / 2; i++ ) {
            iTmp = aTarget[i];
            aTarget[i] = aTarget[ iLen - i - 1 ];
            aTarget[ iLen - i - 1 ] = iTmp;
        }
    
        // 将交换后的数组,组合成字符串
        for ( var j = 0; j < iLen; j++ ) {
            sTmp += aTarget[j];
        }
    
        return sTmp;
        // return aTarget;
    }
    
    console.log( dichotomy( "Hello world !" ) );
    // reverse.html:37 ! dlrow olleH
    

经典阶乘

  • 递归

    function factorialize(num) {
        // "use strict";
      if ( num === 0 || num === 1 ) return 1;
    
      // 严格模式下,已经不允许使用arguments.callee了
      return num * arguments.callee( num - 1 );
    }
    
    console.log( factorialize(5) ); // result: 120;
    
  • 迭代实现,代替递归

    function iterate ( num ) {
        if ( num <= 1 ) return 1;
    
        var iTmp = num;
    
        while ( num > 1) {
            iTmp *= --num;
    
            // num--;
        }
    
        return iTmp;
    }
    
    console.log( iterate(5) );  // 120
    
  • 缓冲方式实现 TODO

  • 回文(一),比较笨拙的方法,通过将字符串用split转成字符数组,然后将数组中的元素平分成左右两个数组,前面的数组用push,后面的用unshift方法存入,通过toString和toLowerCase方法比较两个数组,达到目的。后面会继续优化这个方法,且继续研究其他性能更好的方法;

    function isPalindrome(str) {
      // Good luck!
        var sTarget     = str.replace(/[^a-zA-Z0-9]/g, ""), // 过滤掉非数字和字母的字符
            aLeft       = [],       // 存放左边的元素
            aRight      = [],       // 存放右边的元素
            aTarget     = sTarget.split(""),    // 将目标字符串转成数组
            iLen        = aTarget.length;
    
        for ( var i = 0; i < iLen; i++ ) {
            // 要转整,不然长度为奇数的时候会把中间的那个元素也保存起来了,下同
            if ( i < parseInt( iLen / 2 ) ) {   
                aLeft.push( aTarget[i] );
            } else {
                if ( iLen % 2 !== 0 && i == parseInt(iLen / 2) ) continue;  // 过滤奇数时中间的元素
                aRight.unshift( aTarget[i] );
            }
        }
    
        // 格式化,忽略大小写,比较
        return aLeft.toString().toLowerCase() == aRight.toString().toLowerCase();
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若叶岂知秋vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值