You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解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. 返回逻辑不符合题目要求:题目明确要求字符仅出现一次时返回-1,但你的代码在这种场景下返回了首次出现的索引,完全违背需求。
  2. 类型不一致的隐患:你将数组中的数字类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:05:27