Есть ли лучший способ написать это на Java?

#java

#java

Вопрос:

 public class Palindrome
{
   public static void main ( String [] args )
   {
       Scanner scan = new Scanner ( System.in ) ; // new object named "scan"
       System.out.println ( "nPlease enter a number: "  ) ;
       int num = scan.nextInt () ; //store number into num

       if ( ( (num /1000)==(num%10) ) 
            amp;amp; (    ( (num/10) %10 ) == ( (num/100)%10  )   ) ) 
           // num = 'abcd' : if (a=d) and (b=c) number is a palindrome.
            System.out.println ( "nIs a Palindrome !"  ) ;
      else 
            System.out.println ( "nNot a Palindrome !"  ) ;
   } //end of method main
} //end of class Palindrome
  
  1. Есть ли способ оптимизировать этот код?
    Мне нужно иметь дело только с 4-значным числом!
  2. Как мне добавить проверку того, что число действительно является положительным числом и состоит из 4 цифр?

Комментарии:

1. Вы не знаете, как проверить, является ли int положительным числом?

2. Спасибо за упражнение. Но.. что вы пробовали? Каковы ваши первые предположения, какую конкретную помощь мы можем предложить? SO — это не сайт «Делай мою домашнюю работу».

3. Вы также можете преобразовать свое число в String и выполнить проверку символов на палиндроме. (Или, в первую очередь, оставьте ввод от пользователя в качестве String .)

4. что за ужасающее использование магических чисел? просто проверьте, что обратная сторона строки совпадает с исходной…

5. Вы можете избавиться от всех дополнительных операций с модулем

Ответ №1:

Разделите задачу на более мелкие, более управляемые части, которые вы можете решить. Например:

Чтобы проверить, имеет ли строка длину 4:

 static boolean is4Digit(String p) {  
  return p.length()==4; 
} 
  

Чтобы проверить, находится ли число между 2 числами:

 static boolean isBetween(int nr, int low, int hi) {  
  return nr>low amp;amp; nr<hi; 
} 
  

Чтобы проверить, является ли string палиндромом:

 static boolean isPalindrome(String p) {  
  return p.equals(new StringBuilder(p).reverse().toString());  
}  
  

Комментарии:

1. System.out.println не входит в класс Scanner

Ответ №2:

Как мне добавить проверку того, что число действительно является: во-первых, положительным числом, а во-вторых, 4-значным числом?

Я мог бы интерпретировать 4-значное неотрицательное целое число двумя способами.

 0 <= n amp;amp; n <= 9999
  

или

 1000 <= n amp;amp; n <= 9999
  

Для оптимизации я бы не стал утруждать себя синтаксическим анализом из строки:

 BufferedReader bufferedInput = new BufferedReader(System.in);
String line = bufferedInput.readLine();
if (line == null) { /* handle end of input case */ }
String number = line.trim();
// Check if its a palindrome
if (number.length() == 4
    amp;amp; number.charAt(0) == number.charAt(3)
    amp;amp; number.charAt(1) == number.charAt(2)) {
  // Finally check that the characters are all digits
  boolean isLegal = true;
  for (int i = (number.length()   1) / 2; --i >= 0;) {
    char shouldBeADigit = number.charAt(i);
    if (!('0' <= shouldBeADigit amp;amp; shouldBeADigit <= '9')) {
      isLegal = false;
      break;
    }
  }
  if (isLegal) {
    System.out.println(number   " is a palindrome");
  }
}
  

Комментарии:

1. Если вы сначала выполняете проверку палиндрома, то вам нужно проверить только первые n / 2 символа (n / 2 1, если длина нечетная), поскольку по определению палиндрома остальные также должны быть цифрами.

2. Нельзя проверять только 1000 <= num amp;amp; num <= 9999, потому что, если пользователь введет: 1200.89, что произойдет сейчас?

3. @Mosh, который вы используете int , вы хотите использовать double

4. @M. Jessup, совершенно верно, но если его длина нечетная, я думаю, вам нужно только проверить (n / 2 — 1), поскольку средняя всегда равна самой себе.

5. @Mike, тебе все равно нужно проверить середину, поскольку ты проверяешь, является ли это цифрой. т. Е. если твой тест на палиндром верен (при условии, что он не зависит от буквенных обозначений) и ты не проверяешь середину, строка «123Z321» будет считаться действительной. (Все это основано на тестировании палиндрома, не подтверждающем число). Однако для проверки только палиндрома, я согласен, достаточно n / 2 (я думаю, у вас была опечатка с n / 2 -1, например, n = 7, n / 2 = 3 с целочисленным делением, четвертый символ не имеет значения). Это то, что я сделал в моем примере решения ниже (хотя это может быть не совсем очевидно, оно проверяет только n / 2).

Ответ №3:

Более читаемым способом было бы это:

    Scanner scan = new Scanner ( System.in ) ; // new object named "scan"
   System.out.println ( "nPlease enter a number: "  ) ;
   int num = scan.nextInt () ; //store number into num

   if(num<0 || num>9999)
       System.out.println("Only positive numbers with 4 digits are accepted.");
   else {
       int help=num;
       int rev=0;

       while (help > 0) {
           rev = rev * 10   help %10;
           help = help / 10;
       }
       System.out.println("Is a palindrome: "  (rev==num));
   }
  

Ответ №4:

Чтобы проверить, где вводится число

 public static boolean isNumeric(String str)
{
  NumberFormat formatter = NumberFormat.getInstance();
  ParsePosition pos = new ParsePosition(0);
  formatter.parse(str, pos);
  return str.length() == pos.getIndex();
}
  

Ответ №5:

Чисто математическая реализация isPalindrome (без преобразования строк), которая несколько более эффективна, чем у Криса (хотя, конечно, еще менее интуитивно понятна / читабельна):

 public static boolean isPalindrome(int number) {
  if(number < 0){
    throw new IllegalArgumentException("number must be positive!");
  }
  int powerOf10 = (int)Math.pow(10, (int)Math.floor(Math.log10(number)));
  while(powerOf10 >= 10) {
    number -= powerOf10 * (number % 10);
    if(number < 0 || number >= powerOf10) {
      return false;
    }
    number /= 10;
    powerOf10 /= 100;
  }
  return true;
}
  

Поскольку это вопрос домашнего задания, я оставлю объяснение того, почему это работает, в качестве упражнения для читателя.

Ответ №6:

Вы также могли бы сделать это, используя регулярное выражение с группами захвата и обратными ссылками. Рассмотрите это регулярное выражение для записи двух цифр, а затем запишите еще две цифры, равные первым двум, в обратном порядке:

  private static String PALINDROME = "(\d)(\d)(?:\2)(?:\1)";

 public boolean isPalindrome(String testStr) throws NoMatchFoundException {
     Pattern pattern = Pattern.compile(PALINDROME);
     Matcher matcher = pattern.matcher(testStr);
     return matcher.matches(); 
 }