Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 困惑这个回文测试是如何工作的_Java_Palindrome - Fatal编程技术网

Java 困惑这个回文测试是如何工作的

Java 困惑这个回文测试是如何工作的,java,palindrome,Java,Palindrome,这段代码用于测试简单的回文,但我不清楚它是如何工作的。 我对while循环条件感到困惑,检查if(left左){ 左++; 对--; } System.out.println(); if(左左索引(您已通过字符串的“中间”)时,while循环将结束 如果(leftleft相同,并且字符串是回文(一种情况),则左字符不等于右字符 我希望这会有所帮助。回文测试只有在字符串都是大写或小写时才有效 当左字符不等于右字符,或者右索引>左索引(您已通过字符串的“中间”)时,while循环将结束 如果(lef

这段代码用于测试简单的回文,但我不清楚它是如何工作的。 我对while循环条件感到困惑,检查
if(left
以及它如何自动表示它不是回文

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");
left=0;
右=i.长度()-1;
而(i.charAt(左)=i.charAt(右)和&右>左){
左++;
对--;
}
System.out.println();
if(左<右)
System.out.println(“该字符串不是回文。”);
其他的
System.out.println(“该字符串是回文”);

回文测试只有在字符串都是大写或小写时才有效

当左字符不等于右字符,或者右索引>左索引(您已通过字符串的“中间”)时,while循环将结束

如果(leftleft相同,并且字符串是回文(一种情况),则左字符不等于右字符


我希望这会有所帮助。

回文测试只有在字符串都是大写或小写时才有效

当左字符不等于右字符,或者右索引>左索引(您已通过字符串的“中间”)时,while循环将结束

如果(leftleft相同,并且字符串是回文(一种情况),则左字符不等于右字符


我希望这会有所帮助。

while循环基本上会同时遍历从两侧开始的潜在回文,并比较每一侧的字符。它会检查是否(右>左),因为如果是,这意味着“右”和“左”计数器没有相互传递,因此没有到达(或传递)绳子的中间。 在这个检查之后,它将向右递减(因此它将稍微靠近字符串的中心),并递增“左”(出于相同的原因)

最后,如果“left”仍然小于“right”,则表示循环在“left”或“right”到达字符串中间之前停止,这是因为在某个阶段,相反索引上的字符匹配的条件为false


如果他们真的达到(或通过)中间的“left”将大于等于“right”,这意味着字符匹配条件至少在字符串的中间是正确的,因此是回文。

while循环基本上会同时遍历从两侧开始的潜在回文,并比较每一侧的字符。它正在检查是否(right>left)因为如果是,则表示“right”和“left”计数器没有相互传递,因此没有到达(或传递)字符串的中间。 在这个检查之后,它将向右递减(因此它将稍微靠近字符串的中心),并递增“左”(出于相同的原因)

最后,如果“left”仍然小于“right”,则表示循环在“left”或“right”到达字符串中间之前停止,这是因为在某个阶段,相反索引上的字符匹配的条件为false


如果它们到达(或通过)中间,“left”将大于等于“right”,这意味着字符匹配条件至少在字符串中间为true,因此是回文。

使用print语句可以帮助观察程序运行时的操作

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");
    }
}
如您所见,while循环从字符串的远端开始,比较每侧的字符;如果它们相同,则在每侧移动一个字符。它检查
right>left
,以便知道何时停止。一旦到达中间,
right
将至少相等,如果不大于,
left/代码>因为它们在中间相遇,而且方向相反。

<代码>左>右< /代码>等效于Le>>List。如果两个在中间相遇,这将是正确的。如果<代码>左边<右/代码>,则它们不能在中间相遇。您应该能够在上面的输出中看到这一点。


使用print语句可以在程序运行时观察程序的运行情况

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");
    }
}
如您所见,while循环从字符串的远端开始,比较每侧的字符;如果它们相同,则在每侧移动一个字符。它检查
right>left
,以便知道何时停止。一旦到达中间,
right
将至少相等,如果不大于,
left/代码>因为它们在中间相遇,而且方向相反。

<代码>左>右< /代码>等效于Le>>List。如果两个在中间相遇,这将是正确的。如果<代码>左边<右/代码>,则它们不能在中间相遇。您应该能够在上面的输出中看到这一点。


while语句中的条件检查是否
X==Y
X
。如果这些条件不再有效,它将中断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
不再有效

                     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循环在第三次迭代时中断。此时
X
仍将小于
Y
。因此,如果字符串不是回文,while循环肯定会在
X
Y
满足这两个条件之前中断,即while sta中始终
X
条件tement检查是否
X==Y
X
。如果这些条件不再有效,它将中断while循环

考虑下面的回文

伊特拉