簡體   English   中英

Java-回文程序

[英]Java- Palindrome Program

我被指派完成一個回文程序。 但是,我不能使用 charAt 方法。

通常,我能夠很快解決這個問題。 但是,由於我無法使用 charAt,因此我不知道應該如何執行此操作。

我的想法是取字符串的長度,將其除以二(但這限制了我只能使用偶數個字符的字符串),然后將子字符串轉換為 int,最后比較兩個 int。

到目前為止,這是我的代碼-

public static boolean isPal(String s)
{
    int length = s.length();
    int math = length / 2;
    String side1 = s.substring(1,math);
    String side2 = s.substring(math, length);

    int s1 = Integer.parseInt(side1);
    int s2 = Integer.parseInt(side2);

    if(s1 == s2){
        return true;
    } else {
        return false;
    }
}

但是,我意識到這可能不是,也可能不是處理這種情況的最佳方式。 我目前遇到了這個錯誤-

Exception in thread "main" java.lang.NumberFormatException: For input string: "i"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Palindrome.isPal(Lab08st.java:47)
at Lab08st.main(Lab08st.java:20)

我相信這是因為我需要一個 for 循環。 但是,由於 Java 經驗不足,我不確定。

我願意接受任何和所有建議。 (只要他們不需要 charAt)

用這個:

public static boolean isPal(String s) {
    char[] chars = s.toCharArray();
    int len = chars.length;

    for (int i = 0; i < len ; i++) {
        if(chars[i] != chars[len-i-1] ){
            return false;
        }
    }
    return true;
 }

您的方法存在以下幾種缺陷:

  • Integer.parseInt(String)僅適用於以可選方式簽名的數字字符串,這些數字字符串表示可表示為int類型的以10為底的數字。 您的函數將完全在非數字輸入上以及在太大而無法將兩半表示為int的輸入上失敗(一些19-20個字符的輸入;所有更長的輸入)。
  • 您的函數將對任何具有奇數個字符的輸入失敗,因為您無法將此類輸入平均分成兩半。
  • 無論如何,您的邏輯都是有缺陷的。 它將判斷“ 1010”為回文(不是),並且判斷為“ 1001”不是回文(盡管它是一個)。

您可以通過多種技術來一一挑選出輸入String的字符,其中包括:

  • 您可以通過String.toCharArray()char[]獲得字符,如在其他地方建議的那樣。
  • 您可以通過一系列substring()調用來使用輸入。
  • 您可以使用StringCharacterIterator來遍歷字符

由於尚不清楚為什么不允許使用charAt() ,因此以下是一種完全避免依賴索引的方法:

import java.text.StringCharacterIterator;

// ...

public static boolean isPal(String s)
{
    StringCharacterIterator it = new StringCharacterIterator(s);
    String reversed = ""

    for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
        reversed = c + reversed;
    }

    return reversed.equals(s);
}

有一些更有效的方法,但是這種方法很簡單明了。

或者這是一個(不明確地)依賴String以外的任何類,但確實使用索引0和1的類:

public static boolean isPal(String s)
{
    String tail = s;
    String reversed = ""

    while (tail.length() > 0) {
        reversed = tail.substring(0, 1) + reversed;
        tail = tail.substring(1);
    }

    return reversed.equals(s);
}

還是因為您有將String拆分為兩個的想法,也許是由您的講師指導的? 您也許正在研究遞歸? 因為您還可以通過遞歸算法來反轉輸入字符串:(1)將字符串分成兩部分(盡可能均勻地工作最好); (2)遞歸地反轉每一半; (3)將相反的兩半按相反的順序放回去。 (將練習留作練習。)

綜上所述,請注意,如果Reticality滿足要求,則使用StringBuilder.reverse()的單行代碼在所有方面都更好。

我的解決方案-

import java.util.*;
public class MyClass {
    public static void main(String args[]) {
      
      String str = "pappap";
      String sp = str.toLowerCase();
      char[] ch = sp.toCharArray();
      int len = ch.length;
      int lastIndex = ch.length-1;
      int count = 1;
      int first = 0;
      int last = sp.length()-1;
     for(; first < last  ;){  
              if(ch[first] == ch[last] ){
                  first= first+1;
                  last= last-1; 
               }
             else{
              count = 0;
              break;
              }
      }
      
    String result = (count == 1) ?  "Palindrome" : "Not a palindrome " ;
    System.out.println(result);
}
}

如果要檢查以字符串形式給出的數字是否是回文,那么您可以使用數學來實現。 使用將最低有效數字與最高有效數字進行比較的算法,然后將這些數字刪除並繼續。 如果數字位數為奇數,則無需將該中間數字與任何東西進行比較-您只需要數字位數/ 2步即可。

將此代碼留作練習,因為它是家庭作業。

暫無
暫無

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

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