[英]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個字符的輸入;所有更長的輸入)。 您可以通過多種技術來一一挑選出輸入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.