[英]confused how this palindrome test works
這段代碼可用於測試簡單的回文,但是我對它的工作方式感到困惑。 我對while循環條件感到困惑,檢查if (left < right)
以及它如何自動表示它不是回文。
left = 0;
right = i.length() -1;
while(i.charAt(left) == i.charAt(right) && right > left){
left++;
right--;
}
System.out.println();
if (left < right)
System.out.println ("That string is Not a palindrome.");
else
System.out.println("That string IS a palindrome");
while循環基本上同時從相反的兩側開始遍歷潛在回文,並比較每側的字符。 它正在檢查(右>左)是否存在,這意味着“右”和“左”計數器沒有相互傳遞,因此沒有到達(或通過)字符串的中間。 檢查之后,它會向右遞減(因此它會稍微靠近字符串的中心),並向“左”遞加(出於相同的原因)。
最后,如果'left'仍然小於'right',則意味着循環在'left'或'right'到達字符串的中間之前停止,並且這是因為相反索引的字符在某個階段會匹配是錯誤的。
如果他們確實到達(或通過)中間,則“ left”將大於等於“ right”,這意味着字符匹配條件至少在字符串的中間為真,因此是回文。
僅當您的字符串全部為大寫或小寫時,回文測驗才有效。
當左字符不等於右字符或右索引>左索引(您已傳遞字符串的“中間”)時,while循環將結束。
如果(left <right)與right> left相同,並且該字符串是回文(一種情況),否則左字符不等於右字符。
希望對您有所幫助。
while語句中的條件檢查X == Y
和X < Y
。 如果這些條件不再有效,它將退出while循環。
考慮下面的回文。
迭代1:
X Y
+ +
| |
+-v--+----+---+---+---+---+---+---+-v-+
| | | | | | | | | |
| A | B | C | D | E | D | C | B | A |
+----+----+---+---+---+---+---+---+---+
迭代2:
+----+----+---+---+---+---+---+---+---+
| | | | | | | | | |
| A | B | C | D | E | D | C | B | A |
| | | | | | | | | |
+----+----+---+---+---+---+---+---+---+
^ ^
| |
+ +
X Y
迭代3:
X Y
+ +
| |
v v
+----+----+---+---+---+---+---+---+---+
| | | | | | | | | |
| A | B | C | D | E | D | C | B | A |
| | | | | | | | | |
+----+----+---+---+---+---+---+---+---+
迭代4:
X Y
+ +
| |
+- --+----+---+-v-+---+-v-+---+---+- -+
| | | | | | | | | |
| A | B | C | D | E | D | C | B | A |
+----+----+---+---+---+---+---+---+---+
迭代5:循環將在此時中斷。 由於X < Y
不再有效
XY
++
||
+----+----+---+---+vv-+---+---+---+---+
| | | | | | | | | |
| A | B | C | D | E | D | C | B | A |
| | | | | | | | | |
+----+----+---+---+---+---+---+---+---+
如果上面的例子不是回文,看起來像這樣
+- --+----+---+-v-+---+-v-+---+---+- -+
| | | | | | | | | |
| A | B | K | D | E | D | C | B | A |
+----+----+---+---+---+---+---+---+---+
然后,由於第一個條件X==Y
您的while循環在第3個迭代處中斷。 此時X
仍將小於Y
因此,如果字符串不是回文,而while循環肯定會在X
和Y
遇到之前中斷,即始終X < Y
它有助於使用打印語句來觀察程序在運行時的工作。
class Ideone
{
private static void checkPalindrome(String i) {
int left = 0;
int right = i.length() -1;
System.out.println("This word is: " + i);
System.out.println("Checking charAt(" + left + ") which is " +
i.charAt(left) + " and chartAt(" + right + ") which is " +
i.charAt(right));
while(i.charAt(left) == i.charAt(right) && right > left) {
left++; right--;
System.out.println("Checking charAt(" + left + ") which is " +
i.charAt(left) + " and chartAt(" + right + ") which is " +
i.charAt(right));
}
System.out.println();
if (left < right)
System.out.println ("That string is Not a palindrome.");
else
System.out.println("That string IS a palindrome");
System.out.println();
}
public static void main (String[] args) throws java.lang.Exception
{
checkPalindrome("racecar");
checkPalindrome("abba");
checkPalindrome("java");
}
}
This word is: racecar
Checking charAt(0) which is r and chartAt(6) which is r
Checking charAt(1) which is a and chartAt(5) which is a
Checking charAt(2) which is c and chartAt(4) which is c
Checking charAt(3) which is e and chartAt(3) which is e
That string IS a palindrome
This word is: abba
Checking charAt(0) which is a and chartAt(3) which is a
Checking charAt(1) which is b and chartAt(2) which is b
Checking charAt(2) which is b and chartAt(1) which is b
That string IS a palindrome
This word is: java
Checking charAt(0) which is j and chartAt(3) which is a
That string is Not a palindrome.
如您所見,while循環從字符串的遠端開始,並比較每一側的字符; 如果它們相同,則在每一側移動一個字符。 它檢查“ right > left
以便知道何時停止。 一旦到達中間位置,由於它們在中間相遇並朝相反的方向運動,因此right
至少等於或大於left
。
left < right
的布爾取反等於left >= right
。 如果兩個人在中間相遇,這將是正確的。 如果left < right
那么他們將無法在中間相遇。 您應該能夠在上面的輸出中看到這一點。
在ideone上運行此代碼,然后再使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.