字符串查找
请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第一次出现的位置(找不到返回 -1)。
a='34';b='1234567'; // 返回 2
a='35';b='1234567'; // 返回 -1
a='355';b='12354355'; // 返回 5
isContain(a,b);
题目要求实现的功能其实就是String的indexOf()方法,所以:
function isContain(strA,strB){
return strB.indexOf(strA)
}
但是题目要求“最基本的遍历来实现”,所以不能使用indexOf()方法。用遍历来实现的话:
function isContain(strA,strB){
var arrA = strA.split('')
var arrB = strB.split('')
var flag,temp
for(var j in arrB){
if (arrA[0] === arrB[j]) {
temp = parseInt(j) //注意这里的j是一个字符串。。它居然是个字符串
flag = true
}
}
var index = temp + 1
for (var i = 1; i < arrA.length; i++){
if (arrA[i] !== arrB[index++]) {
flag = false
}
}
if (flag) {
return temp
}else{
return -1
}
}
自己在写这个代码的过程中犯了一个错误:
-
for(in)循环索引是字符串而不是整数。并且我不应该用for in循环来遍历一个数组。
所以代码最好改写成:
function isContain(strA,strB){
var arrA = strA.split('')
var arrB = strB.split('')
var flag,temp
for (var k = 0; k < arrB.length; k++) {
if (arrB[k] === arrA[0]) {
temp = j
flag = true
}
}
var index = temp + 1
for (var i = 1; i < arrA.length; i++){
if (arrA[i] !== arrB[index++]) {
flag = false
}
}
if (flag) {
return temp
}else{
return -1
}
}
然后还有几个要注意的点:
- 用temp来记录匹配的起始位置
- 用flag来判断输出
- 最开始我想比较数组arrA和数组arrB的时候一直找不到好的方法。我试过外部遍历arrA然后在内部遍历arrB但是出错了。后来我发现我并不需要遍历arrB(我不需要拿到它的所有项目,也不需要它的length),我只要将arrA中的每一项与arrB的项依次对比就可以了。所以使用了arrB[index++]。(注意index的初始值为temp+1)
网友评论