一.基础算法之“字符串类”
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"]
总结: