簡體   English   中英

有沒有更好的方法可以用Java編寫呢?

[英]Is there a better way to write this in 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) ) 
            && (    ( (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位數字的校驗?

將任務分解為更小,更易於管理的部分,您可以解決。 例如:

要檢查字符串的長度是否為4:

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

要檢查數字是否在2個數字之間:

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

要檢查字符串是否是回文:

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

如何添加一個數字,以確保它是真正的數字:第一個是正數,第二個是4位數字?

我可以用兩種方式解釋4位非負整數。

0 <= n && n <= 9999

要么

1000 <= n && 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
    && number.charAt(0) == number.charAt(3)
    && 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 && shouldBeADigit <= '9')) {
      isLegal = false;
      break;
    }
  }
  if (isLegal) {
    System.out.println(number + " is a palindrome");
  }
}

更具可讀性的方式是:

   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));
   }

檢查輸入在哪里是數字

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

isPalindrome的純數學實現(無字符串轉換)比Chris的效率更高(盡管當然甚至不那么直觀/可讀):

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;
}

由於這是一個家庭作業問題,因此我將向讀者說明為什么這樣做是一種練習。

您也可以使用帶有捕獲組和反向引用的正則表達式進行此操作。 考慮此正則表達式以捕獲兩個數字,然后以相反的順序捕獲另外兩個與前兩個數字相等的數字:

 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(); 
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM