我试图创建一个名为“回文”的方法,该方法接收一个字符串,如果该字符串是回文,则返回布尔值true,否则返回false。如果一个单词向前和向后读都一样,那么它就是一个回文。比如level这个词就是一个回文。
例如,通过考虑通过删除所有空格和标点符号并将所有字母转换为小写形式获得的文本,将其转换为回文:
女士,我是亚当==
一个人,一个计划,一条运河:巴拿马==
我尝试处理我使用replace eAll()的代码;
并输出作为替换all的最后一行。
public static String palindrome(String n){
char[] input = n.toCharArray();
//for(int i=0; i<input.length; i++){ //looping reversing using input as in length minus 1 from end to start and counting using increment
n.toLowerCase();
String noSpaces = n.replaceAll(" ", ""); //I used this to get string
String remove = noSpaces.replaceAll(",","");
String remove2 = remove.replaceAll(".","");
String remove3 = remove2.replaceAll(":","");
String remove4 = remove3.replaceAll("!", "");
System.out.print(remove4);
//return n;
//}
return n;
}
编译器/输出:
< code >输入:夫人,我是亚当
输出:
输出没有显示任何内容?我做错了什么?
要删除所有特殊字符,只需使用< code > remove . replace all(" \ \ p { Punct } "," ")
此外,您可以通过如下链接“删除”来简化代码:
String output = n.toLowerCase().replaceAll(" ", "").replaceAll("\\p{Punct}", "");
System.out.println(output);
现在,这本身不会返回回文,也不会检查它。若要检查回文,必须创建一个方法,将指针放在字符串的头端和尾端,并比较两个索引处的字符以查看它们是否匹配。您将分别递增和递减这些指针,直到:
例如:
boolean isPalindrome(String word) {
int headPtr = 0;
int tailPtr = word.length() -1 ;
while (headPtr < tailPtr) {
if (word.charAt(headPtr) != word.charAt(tailPtr))
return false;
headPtr++;
tailPtr--;
}
return true;
}
您可以使用偶数和奇数编号的字符串进行测试,以确保中断条件正确。比如奥托,汉娜,1234321,甚至你的长词组。完成的实现应该如下所示:
public class PalindromeTest {
static boolean isPalindrome(String word) {
int headPtr = 0;
int tailPtr = word.length() -1 ;
while (headPtr < tailPtr) {
if (word.charAt(headPtr) != word.charAt(tailPtr))
return false;
headPtr++;
tailPtr--;
}
return true;
}
public static void main (String[] args) {
String n = "A man, a plan, a canal: Panama";
String output = n.toLowerCase().replaceAll(" ", "").replaceAll("\\p{Punct}", "");
System.out.println(n + " is palindrome? " + isPalindrome(output));
}
}
Java的replaceAll()
的第一个参数是regex<代码>
匹配任何字符,因此remove.replaceAll(“.”,“)
实际上为您提供了一个空字符串。
逃离句点
String remove2 = remove.replaceAll("\\.","");
问题是这个点实际上可以匹配任何字符任意次。因此,如果您将< code>remove.replaceAll(" .," ")所有字符都被替换为空。您应该对点进行转义以指定实际的点。希望这有所帮助。
n = n.toLowerCase();//you should assign the result to get lowercase characters
String noSpaces = n.replaceAll(" ", ""); //I used this to get string
String remove = noSpaces.replaceAll(",","");
String remove2 = remove.replaceAll("\\.","");
String remove3 = remove2.replaceAll(":","");
String remove4 = remove3.replaceAll("!", "");
String remove5 = remove2.replaceAll("\'","");//you should also escape apostrophe
System.out.print(remove5);
问题内容: 我想问一个有关在Java中避免字符串重复的问题。 该 情境 是:以标签和属性像这样的一个XML: 使用JibX,此XML将在如下所示的类中进行编组/解组: 该程序是长时间的批处理,因此将创建,使用,复制产品对象。 好吧, 问题 是:当我使用 Eclipse内存分析器(MAT)之 类的软件分析执行时,我发现了几个重复的String。例如,在id属性中, PROD 值在2000个实例左右重
我对编码非常陌生,刚刚接触过静态方法,所以我为这些愚蠢的错误提前道歉。在main下调用该方法时,该方法应该显示一个三角形,但我得到的控制台是空的,没有输出。但是,如果我将此写在main下: 然后,三角形将显示在控制台中,但是对于这个赋值,字符串/三角形必须仅通过使用来调用
我是堆栈溢出的新手,我发现它非常有用,非常感谢一个伟大的社区。虽然我一直在了解 java 中的字符串,但我只是想知道字符串文字源代码是如何创建的?我理解了java中字符串的大部分概念。这是一种特殊的最终类,我也理解在创建 String 文字时,将在堆上创建一个对象,其引用将在字符串常量池中。通过使用这个。 我还了解到,当使用 new 运算符创建字符串时,引用将在堆上具有对象,并在字符串常量池中具有
问题内容: 回文是一个词,短语,数字或其他单位序列,可以读取相同的方式在任何方向。 为了检查一个单词是否是回文,我得到了这个单词的char数组并比较了这些字符。我试过了,看起来很管用。但是我想知道这是对的还是有什么需要改进的地方。 这是我的代码: 问题答案: 为什么不只是: 例: 输入为“ andna”。 i1将为0,i2将为4。 第一次循环迭代,我们将比较和。它们相等,因此我们将i1递增(现在为
问题内容: 在这里,我们将字符串h引用为字符串文字hi。JVM有一个字符串文字池来存储字符串文字,因此我们可以在字符串不可更改的情况下重用它们。 当我们说这的确切含义是什么?我们在谈论什么吗?是否从相同的地址传送时间中选取? 问题答案: 是的,为了简化起见,您可以将其视为从同一地址选择,但更精确的是变量拥有相同的 引用 ,即JVM 在映射到对象的正确内存地址时 使用的 数字/对象ID (对象可以在