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

版权声明:一只会飞的狼 https://blog.csdn.net/sinat_40697723/article/details/87431689

                                                             

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

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"]

总结:

                                                               

猜你喜欢

转载自blog.csdn.net/sinat_40697723/article/details/87431689