求解Codewars题目:查找字符串中字符第二次出现的索引
问题:寻找字符第二次出现的索引
题目要求
编写一个函数,接收字符串和字符作为输入,返回该字符在字符串中第二次出现的索引。若字符串中无该字符,或仅出现一次,均返回-1。
我的实现问题
我尝试用ASCII码转换来区分大小写字母,但随机测试无法通过,不清楚问题所在。我的实现步骤如下:
- 将字符串转换为ASCII码数组,同时将目标字符转换为ASCII码;
- 若目标字符不在数组中,返回-1;
- 若目标字符的首次索引与末次索引不同,将首次出现的位置替换为
'=',返回第二次出现的索引; - 其余情况返回首次出现的索引。
我的代码:
const secondSymbol = (str, symbol) => { console.log(str, symbol); let symbolAscii = symbol.charCodeAt(0); const strArrAscii = str.split('').map(ele => ele.charCodeAt()); if (strArrAscii.indexOf(symbolAscii) === -1) return -1; else if ((strArrAscii.indexOf(symbolAscii) !== strArrAscii.lastIndexOf(symbolAscii))) { strArrAscii[strArrAscii.indexOf(symbolAscii)] = '='; return strArrAscii.indexOf(symbolAscii); } else return strArrAscii.indexOf(symbolAscii); } secondSymbol('CQigLHAAxTuCezwqbqMeGOnECbSyLdNfYUxqkLAUvPZzSFbhTfwSVGWzuqvotdOjRxksLRIAQQvogvUmYAr p\nfYSbpOOLcxuzD', 'L');
问题分析
你的代码存在两个关键错误:
- 返回逻辑不符合题目要求:题目明确要求字符仅出现一次时返回-1,但你的代码在这种场景下返回了首次出现的索引,完全违背需求。
- 类型不一致的隐患:你将数组中的数字类型ASCII码替换为字符串
'=',虽然当前测试可能没触发问题,但如果目标字符的ASCII码恰好等于'='的ASCII码(61),就会导致错误的匹配结果。
解决方案
不需要转换为ASCII数组,直接操作原字符串更简单可靠,利用indexOf的第二个参数指定起始查找位置即可:
const secondSymbol = (str, symbol) => { const firstIdx = str.indexOf(symbol); if (firstIdx === -1) return -1; const secondIdx = str.indexOf(symbol, firstIdx + 1); return secondIdx === -1 ? -1 : secondIdx; }
如果坚持使用ASCII码的方式,修正后的代码如下:
const secondSymbol = (str, symbol) => { const targetAscii = symbol.charCodeAt(0); const asciiArr = str.split('').map(c => c.charCodeAt(0)); const firstIdx = asciiArr.indexOf(targetAscii); if (firstIdx === -1) return -1; const secondIdx = asciiArr.indexOf(targetAscii, firstIdx + 1); return secondIdx === -1 ? -1 : secondIdx; }
内容的提问来源于stack exchange,提问作者Ksedrick
相关产品推荐
相关产品推荐

