JS:使用i作为循环中字符串的索引返回整数,而不是字母

时间:2018-04-27 10:08:20

标签: javascript

学习JS /编程并运行一些基本练习。

这是确定一个单词是否为回文(向前读取与向后相同)。

我的问题是,即使输入回文,函数也会返回false。从踩过来看,似乎string[i]给出了一个比较整数,而不是当前索引的字符。

let input = "hannah";
let firstCharacter = input[0];
let lastIndex = input.length -1;
let lastCharacter = input[lastIndex];


function palTest(string) {
	let j = string[lastIndex];
	if (string.length % 2 === 0 )
	{
		for (i = 0; i <= string.length / 2; i++) {
			if (string[i] === string[j]) {
				j--;
				return true;
			} else {
				return false;
			}
		} 
	} else {
		let middleCharacter = (string.length + 1) / 2;
		for (i = 0; i <= ((string.length + 1) / 2) - 1; i++) {
			if (string[i] === string[j] && middleCharacter == "a" || "e" || "i" || "o" || "u" ) {
				j--;
				return true;
			} else {
				return false;
			}
		} 
	}
}

let x = palTest(input);
console.log(x); // false
console.log(input[0]); // h
console.log(input[1]); // a
console.log(input[2]); // n
console.log(input[3]); // n
console.log(input[4]); // a
console.log(input[5]); // h

在第一个循环的for循环中,我认为hannah[i]代替0而不是"h":所以它将0与{{"h"进行比较1}}(hannah[j])并返回false?

3 个答案:

答案 0 :(得分:1)

一些想法:

  • 使用从开始和结束开始计数的方法,无需区分奇数或偶数长度的字符串,
  • 只有一个循环,
  • 将索引带到字符串的中间,
  • 检查是否不相等,然后使用false
  • 退出功能
  • 如果达到功能结束,则返回true,因为该字符串是回文。

function palTest(string) {
    var i, l;
    for (i = 0, l = Math.floor(string.length / 2); i < l; i++) {
        if (string[i] !== string[string.length - 1 - i]) {
            return false;
        }
    }
    return true;
}

console.log(palTest('hannah'));
console.log(palTest('foo'));

BTW,用这种模式检查,

middleCharacter == "a" || "e" || "i" || "o" || "u"

仅检查带有比较的第一部分,如果不是true,则将下一个字符串"e"视为truthy值作为条件的返回值。

根本没有真正的检查。

答案 1 :(得分:1)

您需要减去lastIndex而不是最后一个索引的值

var input = "hannah";
var fnCheckPal = ( input ) => input == input.split( "" ).reverse().join("");

一个不太详细的方法可能是

var fnCheckPal = (input) => input == input.split("").reverse().join("");

console.log( fnCheckPal( "hannah" ) );
console.log( fnCheckPal( "hantnah" ) );
console.log( fnCheckPal( "hann33ah" ) );

<强>演示

{{1}}

答案 2 :(得分:1)

我建议稍微简化你的逻辑,因为你只需要一个循环,一个变量而没有全局存储的东西。只需循环一次,检查当前索引是否等于最终的相同索引,如果不是,则它不是回文。偶数或不均匀的字母数量甚至不会产生影响:

&#13;
&#13;
function testPalindrome( string ){
  
  for( let i = 0; i < string.length / 2; i++ ){
    
    if( string[ i ] !== string[ string.length - 1 - i ] ){
      
      return false;
      
    };
    
  }
  
  return true;
  
}

console.log( testPalindrome( 'hannah' ) ); // true
console.log( testPalindrome( 'aba' ) ); // true
console.log( testPalindrome( 'stackoverflow' ) ); // false
&#13;
&#13;
&#13;