计算字符串中字符的出现次数

时间:2014-04-11 15:17:55

标签: javascript

我创建了一个函数来计算给定字符串中x和o的出现,如果它们相等则返回true。

function ExOh(str) { 
  var x_count = 0;
  var o_count = 0;

  for (var i = 0;i < str.length-1;i++){
    if (str[i] === 'x'){
      x_count = x_count + 1;
    }
    else if (str[i] === 'o'){
      o_count = o_count + 1;
    }
  }

  console.log(o_count);
  console.log(x_count);
  if (x_count === o_count){
    return true;}
  else{
    return false;
  }

}
// keep this function call here 
// to see how to enter arguments in JavaScript scroll down
ExOh(readline());   

我添加了代码行

  console.log(o_count);
  console.log(x_count);

要查看它是否正确计数,我发现这是问题所在。在测试之后,我意识到这个函数没有测试字符串中的最后一个元素。我尝试改变for循环的长度,但我不能想到还有什么可能是错的。

有什么建议吗?

感谢队友

5 个答案:

答案 0 :(得分:3)

JavaScript数组是基于0索引的对象。所以,你的循环应该是这样的

for (var i = 0; i < str.length; i++) {

否则将跳过最后一个元素。

请考虑字符串的长度为5。因此,i从0开始,如果你有原始状态

for (var i = 0; i < str.length - 1; i++) {

以下是循环中发生的比较

0 < 4
1 < 4
2 < 4
3 < 4
4 < 4 -- Fails

所以它突破了循环。但是最后一个元素将在索引4处。但是当你有这样的条件时

for (var i = 0; i < str.length; i++) {

比较就像这样

0 < 5
1 < 5
2 < 5
3 < 5
4 < 5
5 < 5 -- Fails

只有在比较所有元素后才会突破循环。

所以,你的实际程序可以像这样编写

function ExOh(str) {
    var x_count = 0, o_count = 0;

    for (var i = 0; i < str.length; i++) {
        if (str[i] === 'x') {
            x_count = x_count + 1;
        } else if (str[i] === 'o') {
            o_count = o_count + 1;
        }
    }

    return x_count === o_count;
}

答案 1 :(得分:0)

你的for循环运行太短了。试试这个。

  for (var i = 0;i < str.length;i++){
    if (str[i] === 'x'){
      x_count = x_count + 1;
    }
    else if (str[i] === 'o'){
      o_count = o_count + 1;
    }
  }

答案 2 :(得分:0)

计算字符的替代方法:

var s = 'example';
s.split('').filter(function (i) { return i === 'e'; }).length; // 2

答案 3 :(得分:0)

我没有使用for循环整个 String ,而是查看使用indexOf是否能获得更快的结果

function countOccurance(haystack, needle) {
    var total = 0, pos = -1;
    while (-1 !== (pos = haystack.indexOf(needle, pos + 1)))
        total += 1;
    return total;
}

然后

var x_count = countOccurance(str, 'x'),
    o_count = countOccurance(str, 'o');

return x_count === o_count;

编辑看起来我可能错了它更快! jsperf

function indexOfMethod(haystack, needle) {
    var total = 0, pos = -1;
    while (-1 !== (pos = haystack.indexOf(needle, pos + 1)))
        total += 1;
    return total;
}
function splitMethod(haystack, needle) {
    return haystack.split(needle).length - 1;
}
function forMethod(haystack, needle) {
    var total = 0, i;
    for (i = 0; i < haystack.length; ++i)
        if (haystack.charAt(i) === needle)
            total += 1;
    return total;
}

forMethod仅适用于 char needle,而其他两个应该与任何 String 一起使用needle,如果重要的话。

答案 4 :(得分:0)

您的问题出在for循环中。尝试改变这一点。

for (var i = 0; i < str.length; i++) {

如果您想避免使用for循环,可以使用这个更短版本的ExOh函数。

function ExOh(str) { 
  return str.match(/o/g).length == str.match(/x/g).length
}