称自己为菜鸟会令菜鸟看起来很糟糕...让我们先看一下代码
...
bool isPalindrome(String s){
for(int i = 0; i < s.length/2;i++){
if(s[i] != s[(s.length-1) -i])
return false;
}
return true;
}
main() {
print(isPalindrome("anna"));
print(isPalindrome("cat"));
}
...
结果正确-错误
我在Dart示例的“初学者”列表中碰到了什么,即使我将
s.length
中的字母数更改为"cat"
,它也是“false”,所以"cats"
是什么,因此它不计算字母数,但"caac"
是“true”。有人可以请您深入解释该代码的功能。
最佳答案
您的误解不在代码中,而是在“回文”中。回文是一个单词,其正反方向相同。例如,如果您使用单词“racecar”并颠倒了字母的顺序,则结果将是“racecar”,即完全相同的单词。
该代码对“anna”返回true,因为这仍然是正确的-向后“anna”又是“anna”。它为“猫”返回false,因为向后拼写为“tac”,这是一个完全不同的词,因此表明“猫”不是回文。 (同样,向后“caac”是“caac”,因此是回文,而“猫”向后是“stac”,因此不是回文。)
代码的工作方式是将单词中的每个字母与镜像位置的字母进行比较。例如,第一个字母的镜像位置是最后一个字母,第二个字母是倒数第二个字母,依此类推。如果字母相同,则循环继续。如果到达末尾,并且比较的每个字母都相同,那么该单词的前后拼写相同,这意味着它是回文。
V
racecar ==Same letter, continuing==
^
V
racecar ==Same letter, continuing==
^
V
racecar ==Same letter, continuing==
^
V
racecar ==Same letter, continuing==
^
==The end has been reached, the word is a palindrome, return true==
但是,如果到达某个字母和相反位置的字母不相同的地步,则意味着该单词的拼写向后不会与向前拼写相同,这意味着它不是回文。
V
abcaa ==Same letter, continuing==
^
V
abcaa ==Different letter, the word is not a palindrome, return false==
^
(在循环中仅上升至
length/2
的原因是,一旦支票通过中途标记,它将开始比较已经比较过的字母。即在“abcde”中,将“b”与“d”进行比较与比较“d”到“b”,因此循环会中途切出,以避免不必要的比较。)