
本文介绍一种健壮、通用的方法,用于在字符串数组中定位唯一一个与其他元素内容相同但拼写完全逆序的元素,并精确返回其索引位置,彻底解决首项为异常值时逻辑失效的问题。
本文介绍一种健壮、通用的方法,用于在字符串数组中定位唯一一个与其他元素内容相同但拼写完全逆序的元素,并精确返回其索引位置,彻底解决首项为异常值时逻辑失效的问题。
在实际开发中,我们常遇到一类“多数一致、仅一特例”的识别问题:给定一个字符串数组,其中所有字符串都代表同一单词(如 "dog"),但恰好有一个是该单词的完全逆序(如 "god"),其余均为正序。目标是准确返回这个逆序字符串的索引——而非简单比较字面相等,因为 petList[0] === 'god' 和 petList[1] === 'dog' 字符串本身不同,但语义上互为镜像。
原代码的核心缺陷在于:它假设 pets[0] 一定是“主流”形式,并仅通过 !== petOne 判断异常项。一旦逆序词位于索引 0(如 ['god', 'dog', 'dog']),循环从 i = 1 开始,永远找不到与 'god' 不同的项,最终返回 undefined,逻辑完全失效。
正确解法应脱离对首项的依赖,转而识别“唯一性”本质:逆序词在整个数组中仅出现一次,而所有正序词至少出现两次(题目隐含条件:n ≥ 3 且仅一个异常)。因此,我们可利用 indexOf() 与 lastIndexOf() 的对称性——若某元素的首次出现位置等于末次出现位置,则该元素在数组中唯一。
以下是优化后的完整实现:
function findWrongWayWord(pets) {
// 边界处理:空数组或单元素
if (!pets || pets.length === 0) return -1;
if (pets.length === 1) return 0;
// 找出数组中唯一出现一次的字符串(即逆序词)
const uniqueItem = pets.find(str =>
pets.indexOf(str) === pets.lastIndexOf(str)
);
// 返回其索引(确保即使有重复正序词,也能精确定位唯一项)
return pets.indexOf(uniqueItem);
}
// 测试用例
console.log(findWrongWayWord(['god', 'dog', 'dog', 'dog'])); // → 0
console.log(findWrongWayWord(['dog', 'god', 'dog', 'dog'])); // → 1
console.log(findWrongWayWord(['cat', 'tac', 'cat', 'cat'])); // → 1
console.log(findWrongWayWord(['racecar', 'racecar', 'racercar'])); // → 2(注意:此例非严格逆序,仅演示唯一性逻辑)✅ 关键优势:
- 不依赖顺序假设:无论逆序词在开头、中间或结尾,均能正确捕获;
- 时间复杂度可控:find() + indexOf()/lastIndexOf() 在小规模数组中高效(最坏 O(n²),但实际场景 n 很小);
- 语义清晰:直接表达“找唯一值”这一业务意图,代码自解释性强。
⚠️ 注意事项:
- 本解法基于题目约束“仅一个字符串与其他所有字符串互为逆序”,未验证字符串是否真正互为逆序(如 'dog' ↔ 'god')。如需强校验,可扩展为:先找出唯一项,再检查它是否等于任一主流项的反转:
const majority = pets.filter(s => s !== uniqueItem)[0]; const isReversed = uniqueItem === majority.split('').reverse().join(''); return isReversed ? pets.indexOf(uniqueItem) : -1; - 若数组存在多个唯一项(违反题设),find() 返回第一个,结果不可预测——建议前置校验:const uniques = pets.filter(s => pets.indexOf(s) === pets.lastIndexOf(s)); if (uniques.length !== 1) throw new Error('Exactly one reversed word expected');。
综上,跳出“以首项为基准”的思维定式,转而抓住“逆序词必然唯一”的数学本质,是解决此类问题的简洁、鲁棒之道。

















