力扣简125 验证回文串
String的内置操作 包括了StringBuffer和Character
最开始自己写的既没考虑空字符串,又没考虑大小写,也没吃掉空格和逗号等。然后在提交过程中报错才知道修改。

package leetcode01; public class Solution125 { public static boolean isPalindrome(String s) { s = s.toUpperCase();//转大写 for(int i=0,j=s.length()-1;i<=j;i++,j--) { while((s.charAt(i)<'0' || s.charAt(i)>'Z' || (s.charAt(i)>'9'&&s.charAt(i)<'A'))&&i<j) //吃除字母和数字的其他所有, 而对于光空格的可能会导致i不断增加越界,故用i<j限制 i++; while((s.charAt(j)<'0' || s.charAt(j)>'Z' || (s.charAt(j)>'9'&&s.charAt(j)<'A'))&&j>i) j--; if(s.charAt(i)!=s.charAt(j)) { return false; } } return true; } public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(isPalindrome(" ")); } }
题解1:熟练字符串相关操作的使用:
(string)s.toUpperCase 全部转为大写
StringBuffer buffer=new StringBuffer() 用于缓冲string,最后需要用buffer.toString();转回字符串
Character.isLetterOrDigit((char)ch) 用于判断字符是否为数字或字母
buffer.reverse 用stringBuffer内置反转函数可以实现string的反转(需要转为string)
//题解一:为了熟悉相关字符串API的使用 public static boolean isPalindrome(String s) { s=s.toUpperCase(); StringBuffer buffer=new StringBuffer(); for(int i=0;i<s.length();i++) { char ch=s.charAt(i); if(Character.isLetterOrDigit(ch)) { buffer.append(ch); } } StringBuffer reverseBuffer=new StringBuffer(buffer); buffer.reverse(); //reverseBuffer=buffer.reverse(); //这个reverse会导致buffer变成 反转后的结果 如果new StringBuffer()建立reverseBuffer,再buffer给它赋值,两者会指向相同的内存,比较时始终正确。 return buffer.toString().equals(reverseBuffer.toString()); }
题解2:自己写的方法其实就是2的优化!只不过自己不会用string内置函数,所以看起来复杂一些。

//题解二:左右指针的移动 public static boolean isPalindrome(String s) { s=s.toLowerCase(); StringBuffer buffer=new StringBuffer(); for(int i=0;i<s.length();i++) { char ch=s.charAt(i); if(Character.isLetterOrDigit(ch)) { buffer.append(ch); } } for(int i=0,j=buffer.length()-1;i<j;i++,j--) { if(buffer.charAt(i)!=buffer.charAt(j)) { return false; } } return true; }

浙公网安备 33010602011771号