2015-06-24 29 views
1

我正在尝试编写一个函数,它需要一个单词和一个字母,并从该字符串的中心找到该字母的距离(只有第一次出现,我将迭代该函数)。查找字符串中间的字符距离

对于字母奇数的话,我可以写

if (word.indexOf(letter) !== -1 && word.length % 2 == 1) { 
    dist = absoluteValOf(Math.floor(word.length/2) - word.indexOf(letter)); 
} 

但即使串,我想中间的两个字符算作中间(即“A”中的兔子是1远离中间)。有一个很好的通用解决方案吗?

+3

可以给你一个示例输入/输出来帮助澄清你想要什么? – depperm

+0

是的,你会传递一个单词和一个字母(例如“兔子”和“a”)的函数,它会返回索引从第一次出现的位置开始的距离。所以,兔子和a会返回1,兔子和我也会如此。兔子和你会返回1,但兔子和B会返回2.这是否有道理?谢谢 – Lableable

+0

为了澄清关于偶数个字母的单词的观点,中间的2个字母被计算为一个用于计算的目的,所以这个单词可以被当作“ra bb it” – Lableable

回答

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'));

说明:我们减少字符串长度由一种和鸿沟,找到中间比较indexOf值。对于6个字母词,我们得到矩阵:

[2.5, 1.5, .5, -.5, -1.5, -2.5] 

和5个字母组成单词,我们得到:

[2, 1, 0, -1, -2] 

这是从中间一个实际距离。现在我们只需要floor绝对值,因为您希望中间的字符具有零距离(否则我们将Math.ceil他们和'兔'中的'b'将有距离1)。

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);