我正在尝试编写一个带字和字母的函数,并找到该字母与字符串中心的距离(仅第一次出现,我将迭代该函数)。
对于有奇数个字母的单词,我可以写
if (word.indexOf(letter) !== -1 && word.length % 2 == 1) {
dist = absoluteValOf(Math.floor(word.length / 2) - word.indexOf(letter));
}
但是对于偶数字符串,我想将中间两个字符作为中间数(即兔子中的“a”距离中间1个)。有一个很好的通用解决方案吗?
答案 0 :(得分:2)
您必须检查搜索到的字母的索引是否在单词本身的前半部分或后半部分中。然后:
如果是在上半场,距离是
dist = Math.abs((word.length / 2) -1) - word.indexOf(letter));
如果是在后半段,距离是
dist = Math.abs((word.length / 2) - word.indexOf(letter));
var word='rabbit';
var letter='a';
var dist=0;
if (word.indexOf(letter) !== -1) {
if(word.indexOf(letter)<word.length/2)
dist = Math.abs(Math.floor(word.length / 2)-1 - word.indexOf(letter));
else
dist = Math.abs((word.length / 2) - word.indexOf(letter));
}
console.log(dist);
&#13;
答案 1 :(得分:1)
您遇到了问题,因为indexOf方法基于零,而字符串长度从1开始。您可以通过以下方式取消它:
function distance(ch, str) {
return Math.floor(Math.abs((str.length-1)/2-str.indexOf(ch)));
};
console.log(distance('b', 'Rabbit'));
console.log(distance('t', 'Rabbit'));
console.log(distance('u', 'Bunny'));
console.log(distance('y', 'Bunny'));
&#13;
说明:我们将字符串长度减少一个而不是除以找到与indexOf
值相比的中间值。对于6个字母的单词,我们得到矩阵:
[2.5, 1.5, .5, -.5, -1.5, -2.5]
我们得到5个字母的单词:
[2, 1, 0, -1, -2]
这是中间的真实距离。现在我们只需要floor
绝对值,因为你希望中间的字符具有零距离(否则我们会Math.ceil
它们和&#39; b&#39;在&#39;兔子的距离是1)。