js数据结构与算法 -------1

                                                             

一.基础算法之“字符串类”

1.1反转字符串原理讲解:

                                                       

原理:

首先把句子分隔开,然后把字符串变成一个数组,数组中的先后顺序就是单词的先后顺序,然后把每个数组中的单词进行反转即可。

    let reverseWord = (str) => {
      //字符串按空格进行分隔,保存在数组中,数组每一项的顺序就是单词的顺序
      let arr = str.split(' ');
      //对数组进行遍历,然后每个元素进行反转
      let result = arr.map((item) => {
        return item.split('').reverse().join('');
      });
      return result.join(' ');
    }

    console.log(reverseWord('hello world'));    //olleh dlrow

上面的代码不太优雅,比较冗余。因为声明了好几个变量。修改如下:

    let reverseWord = (str) => {
      //1.字符串按空格进行分隔,保存在数组中,数组每一项的顺序就是单词的顺序
      //2.对数组进行遍历,然后每个元素进行反转
      return str.split(' ').map(item => {
        return item.split('').reverse().join('');
      }).join(' ');
    }

    console.log(reverseWord('hello world'));    //olleh dlrow

 

面试时如果问还有没别的解决办法,如下:

1. 将split参数的空格换成正则

    let reverseWord = (str) => {
      //1.字符串按空格进行分隔,保存在数组中,数组每一项的顺序就是单词的顺序
      //2.对数组进行遍历,然后每个元素进行反转
      return str.split(/\s/g).map(item => {
        return item.split('').reverse().join('');
      }).join(' ');
    }

    console.log(reverseWord('hello world'));    //olleh dlrow

2. 不使用split方法,使用match加正则表达式匹配

    let reverseWord = (str) => {
      //1.字符串按空格进行分隔,保存在数组中,数组每一项的顺序就是单词的顺序
      //2.对数组进行遍历,然后每个元素进行反转
      return str.match(/[\w']+/g).map(item => {
        return item.split('').reverse().join('');
      }).join(' ');
    }

    console.log(reverseWord('hello world'));    //olleh dlrow

总结:

                                 

 


1.2  计算子串原理讲解:

                                                 

                                                  

 

原理:

首先,找出每一个输入与输出的关系,并画出来,

我们从上面的图可以发现规律, 每一行的第一个红体字都往后移了一位。即输出是从输入的第一位开始找,每找到一位就向后一位。可以通过递归方法实现。

    let total = (str) => {
      //建立数据结构,堆栈,保存数据
      let r = [];
      //给定任意子输入都返回第一个符合条件的子串
      let match = (str) => {
        let j = str.match(/^(0+|1+)/)[0];
        let o = (j[0] ^ 1).toString().repeat(j.length);
        let reg = new RegExp(`^(${j}${o})`);
        if (reg.test(str)) {
        	return RegExp.$1;
        } else {
          return '';
        }
      };
      for(let i = 0, len = str.length -1; i < len; i++) {
        let sub = match(str.slice(i));
        if (sub) {
          r.push(sub);
        }
      };
      return r;
    }
    console.log(total('00110011'));  //["0011", "01", "1100", "10", "0011", "01"]

总结:

                                                               

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值