我创建了一个函数来计算给定字符串中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循环的长度,但我不能想到还有什么可能是错的。
有什么建议吗?
感谢队友
答案 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
}