昨天去腾讯一面遇到这么一个题目
判断字符串a是否被包含字符串b中,并返回第一次出现的位置(找不到返回-1,不允许使用indexof)
看到这个第一念头想用正则实现,但是忽然忘记了正则怎么动态传参。于是放弃,就中规中矩使用遍历实现。
遍历实现
现场实现的代码逻辑差不多是这样的,使用2次遍历实现。
function indexOf(str1, str2) {
for (let index = 0; index < str2.length - str1.length; index++) {
if (str1[0] === str2[index]) {
let tmp = true
for (let j = 0; j < str1.length; j++) {
if (str1[j] !== str2[index+j]) {
tmp = false
}
}
if (tmp) return index
}
}
return -1;
}
然后今天自己查了下动态正则传参,又写了一下正则,发现,正则是真的好简单
正则实现
function indexOf(str1, str2) {
let reg = new RegExp(str1)
let index = -1
str2.replace(reg, function(all, i) {
index = i
})
return index
}
然后跟小伙伴交流了一下,还可以这样!
function indexOf(str1, str2) {
let reg = new RegExp(str1).exec(str2)
return reg === null ? -1 : reg.index;
}
然后借鉴了一下,那这样也是可以的!
function indexOf(str1, str2) {
let reg = new RegExp(str1)
let result = str2.match(reg)
return result === null ? -1 : result.index;
}
甚至可以通过split骚操作
split实现
function indexOf(str1, str2) {
let arr = str2.split(str1)
return arr[0] !== str2.length ? arr[0].length : -1
}
妙啊妙啊,果然解决问题的方法永远是很多的!