如何在 Java 中获取字符串的回文
How to get the palindrome of a string in Java
Ok.I 知道还有其他几个很好的程序可以检查字符串是否为回文。
但我正在尝试这个 code.The 问题是因为我逐个字符检查,每次字符匹配它打印出来
回文.
但是我只想打印一次回文。
有没有办法让我可以完全遍历循环然后执行 print 语句?
import java.util.Scanner;
public class Solution{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String A = scan.next();
for(int i =0;i<(A.length()/2);i++)
{
if(A.charAt(i)==A.charAt(A.length()-i-1))
System.out.println("palindrome");
else
System.out.println("not palindrome");
}
}
}
在您的代码中,您检查前半部分字符与后半部分字符,并在每个字符上打印 palindrome
/not palindrome
。
相反,您应该遍历整个字符串,确定整个字符串是否为回文,然后在最后打印一次。
这是修复代码的一种简单方法:
// At the start, we assume the string is a palindrome.
boolean palin = true;
// We loop through the characters, looking for evidence to contradict our
// assumption. Once palin becomes false, it can never become true again.
for(int i =0;i<(A.length()/2);i++)
{
if(A.charAt(i)!=A.charAt(A.length()-i-1))
palin = false;
}
// Now the Boolean variable tells us the answer we want.
if (palin) System.out.println("palindrome");
else System.out.println("not palindrome");
您应该跟踪字符串是否仍然有效,例如:
boolean palin = true;
for(int i =0 ; i < A.length()/2 ; i++) {
if(A.charAt(i)!=A.charAt(A.length()-i-1)) {
palin = false;
break;
}
}
if(palin) System.out.println("Is Palindrome");
else System.out.println("Is Not a Palindrome");
我会保留一个 boolean
标志(默认为 true
),如果不是,则设置为 false
。然后在循环后检查你的标志。像,
boolean palindrome = true;
for(int i = 0; i < (A.length() / 2); i++)
{
if (A.charAt(i) != A.charAt(A.length() - i - 1)) {
palindrome = false;
break;
}
}
if (palindrome) {
System.out.println("palindrome");
} else {
System.out.println("not palindrome");
}
您可以使用 ternary(或条件运算符 ? :
)编写最后一部分,例如
System.out.println(palindrome ? "palindrome" : "not palindrome");
和,你可以用StringBuilder.reverse()
替换循环,比如
boolean palindrome = new StringBuilder(A).reverse().toString().equals(A);
所以,它可能是像
这样的一条线
System.out.println(new StringBuilder(A).reverse().toString().equals(A)
? "palindrome" : "not palindrome");
我喜欢上面给出的所有回复。但是,我认为您的代码将存在以下问题:
1. 它将单个字符视为回文。
2、不会将Rotor和rotoR识别为回文。
我还为您添加了代码,以根据您的文件对您的方法进行基准测试。我认为这是非常昂贵的。所以重新考虑使用更好的算法。
package algorithms;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;
public class PalindromeAnalysis {
public static void main(String[] args) {
Path p1 = Paths.get("/Users/droy/var/palindrome.txt");
Scanner scan = null;
try {
scan = new Scanner(p1);
} catch (IOException e) {
e.printStackTrace();
}
long st1 = System.currentTimeMillis();
while (scan.hasNext()){
String A = scan.next();
boolean isPalindrome = true;
try {
if (A.length() <= 2) throw new Exception("Is not a Palindrome");
for(int i =0; i<(A.length()/2);i++)
{
if (A.toUpperCase().charAt(i) != A.toUpperCase().charAt(A.length()-i-1)){
throw new Exception("Is not a Palindrome");
}
}
}
catch (Exception e) {
isPalindrome = false;
}
if (isPalindrome){
System.out.println("This is Palindrome : " + A);
}
else {
System.out.println("This is not Palindrome" + A);
}
}
long et1 = System.currentTimeMillis();
System.out.println("Time it took was:" + (et1 - st1) + " ms");
}
}
Ok.I 知道还有其他几个很好的程序可以检查字符串是否为回文。
但我正在尝试这个 code.The 问题是因为我逐个字符检查,每次字符匹配它打印出来
回文.
但是我只想打印一次回文。
有没有办法让我可以完全遍历循环然后执行 print 语句?
import java.util.Scanner;
public class Solution{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String A = scan.next();
for(int i =0;i<(A.length()/2);i++)
{
if(A.charAt(i)==A.charAt(A.length()-i-1))
System.out.println("palindrome");
else
System.out.println("not palindrome");
}
}
}
在您的代码中,您检查前半部分字符与后半部分字符,并在每个字符上打印 palindrome
/not palindrome
。
相反,您应该遍历整个字符串,确定整个字符串是否为回文,然后在最后打印一次。
这是修复代码的一种简单方法:
// At the start, we assume the string is a palindrome.
boolean palin = true;
// We loop through the characters, looking for evidence to contradict our
// assumption. Once palin becomes false, it can never become true again.
for(int i =0;i<(A.length()/2);i++)
{
if(A.charAt(i)!=A.charAt(A.length()-i-1))
palin = false;
}
// Now the Boolean variable tells us the answer we want.
if (palin) System.out.println("palindrome");
else System.out.println("not palindrome");
您应该跟踪字符串是否仍然有效,例如:
boolean palin = true;
for(int i =0 ; i < A.length()/2 ; i++) {
if(A.charAt(i)!=A.charAt(A.length()-i-1)) {
palin = false;
break;
}
}
if(palin) System.out.println("Is Palindrome");
else System.out.println("Is Not a Palindrome");
我会保留一个 boolean
标志(默认为 true
),如果不是,则设置为 false
。然后在循环后检查你的标志。像,
boolean palindrome = true;
for(int i = 0; i < (A.length() / 2); i++)
{
if (A.charAt(i) != A.charAt(A.length() - i - 1)) {
palindrome = false;
break;
}
}
if (palindrome) {
System.out.println("palindrome");
} else {
System.out.println("not palindrome");
}
您可以使用 ternary(或条件运算符 ? :
)编写最后一部分,例如
System.out.println(palindrome ? "palindrome" : "not palindrome");
和,你可以用StringBuilder.reverse()
替换循环,比如
boolean palindrome = new StringBuilder(A).reverse().toString().equals(A);
所以,它可能是像
这样的一条线System.out.println(new StringBuilder(A).reverse().toString().equals(A)
? "palindrome" : "not palindrome");
我喜欢上面给出的所有回复。但是,我认为您的代码将存在以下问题:
1. 它将单个字符视为回文。
2、不会将Rotor和rotoR识别为回文。
我还为您添加了代码,以根据您的文件对您的方法进行基准测试。我认为这是非常昂贵的。所以重新考虑使用更好的算法。
package algorithms;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Scanner;
public class PalindromeAnalysis {
public static void main(String[] args) {
Path p1 = Paths.get("/Users/droy/var/palindrome.txt");
Scanner scan = null;
try {
scan = new Scanner(p1);
} catch (IOException e) {
e.printStackTrace();
}
long st1 = System.currentTimeMillis();
while (scan.hasNext()){
String A = scan.next();
boolean isPalindrome = true;
try {
if (A.length() <= 2) throw new Exception("Is not a Palindrome");
for(int i =0; i<(A.length()/2);i++)
{
if (A.toUpperCase().charAt(i) != A.toUpperCase().charAt(A.length()-i-1)){
throw new Exception("Is not a Palindrome");
}
}
}
catch (Exception e) {
isPalindrome = false;
}
if (isPalindrome){
System.out.println("This is Palindrome : " + A);
}
else {
System.out.println("This is not Palindrome" + A);
}
}
long et1 = System.currentTimeMillis();
System.out.println("Time it took was:" + (et1 - st1) + " ms");
}
}