Java 中的字符数组问题疑难解答

Troubleshooting Character Array Problem in Java

我正在经历一个回文(特别是字符串回文)问题,正在检查字符串是否是回文。但是程序出现问题

public static void main(String args[])
{

    Scanner sc= new Scanner(System.in);
    int n,flag=0;
    n=sc.nextInt();
    char a[]=new char[n];
    int l=0;
    int h=n-1;
    while(l<h)
    {

        if(a[l++]!=a[h--])
        {
            flag=1;
        }
    }
    if(flag==1)
    {
        System.out.println("String is not Palindrome");
    }
    else{
        System.out.println("String is Palindrome"); 
    }

}

上面是我写的代码,但问题是,我创建了一个字符数组而不是字符串。 争论的重点是上述代码在代码标准方面是正确的。

请使用下面的代码来检查给定的 String/number 是否回文

public static void main(String args[])   {  
      String original, reverse = ""; 
      Scanner in = new Scanner(System.in);   
      System.out.println("Enter String "); 
      original = in.nextLine();   
      int n = original.length();   
      for ( int index = n - 1; index >= 0; index-- )  {
         reverse = reverse + original.charAt(index);
        }  
      if (original.equals(reverse))  {
        System.out.println("String is Palindrome");
     } else  {
           System.out.println("String is not Palindrome");  
    }

}  

is the above code correct in terms of code standards

不是真的:

  • 不要将局部变量命名为 l(小写 L)。太容易和1(一)混淆了。 因为我不知道 h 应该是什么 shorthand,所以我在下面将 lh 更改为 ij ,因为这些是非常常见的整数迭代器变量名称。

  • 不要在需要之前声明局部变量。使用 int n = sc.nextInt();

  • 不要在变量名上放置数组声明。把它放在类型上,因为它定义了类型。

  • 不要将 0 / 1 用于 false / true 值。将 flag 更改为 boolean,并将其命名为更好的名称,例如描述它的价值。 notPalindrome 在这里似乎很合适。它有助于记录代码。

  • while 循环应该是 for 循环。它有助于将循环逻辑保持在一起,并与其他逻辑隔离,并且有助于限制循环变量的范围。

这些是我对编码标准的评论。

但是,您的代码不起作用,因为您永远无法从用户那里获得字符串。您选择使用 char[] 没问题,但您需要更改获取它的逻辑。请参阅下面的代码,了解如何使用 toCharArray() 来做到这一点。

此外,一旦发现差异,您应该退出循环,方法是同时检查循环条件中的布尔变量,或使用 break。就个人而言,我更喜欢 break.

Scanner sc = new Scanner(System.in);
String sentence = sc.nextLine();
char[] a = sentence.toCharArray();

boolean notPalindrome = false;
for (int i = 0, j = a.length - 1; i < j; i++, j--) {
    if (a[i] != a[j]) {
        notPalindrome = true;
        break;
    }
}
if (notPalindrome) {
    System.out.println("String is not Palindrome");
} else {
    System.out.println("String is Palindrome"); 
}