双指针
344-Reverse String (了解一下递归的解法)
//编写一个函数,将输入的字符串反转过来,输入字符串以字符数组char[]的形式给出。
//不要另外分配额外的空间,必须原地修改输入数组,使用O(1)的额外空间解决这一问题。 //做对了,不需要额外复习!!!!!!!!!!!!!!!!!!!!!!!
public void reverseString(char[] s) {
int n=s.length-1;char c=0;
for(int i=0;i<=n/2;i++) {
c=s[i];
s[i]=s[n-i];
s[n-i]=c;
}
}
345-Reverse Vowels of a String
//345反转字符穿的元音字母 //双指针,left right,判断是否元音字母,否则++,是的话交换再++
//这个解答是正确的,但是时间过长,应该找一个更好的判断元音字母方法 //可以这样判断,只是把if的顺序改一下!!!!!!!
public static String reverseVowels(String s) {
int left=0,right=s.length()-1;
char[] s1=s.toCharArray();
while(left<right) {
//循环停条件:left=right
char l=s1[left];
char r=s1[right];
char sw=0;
//单引号是char双引号是string
//注意不要掉了大写字母
if(l!='a'&&l!='e'&&l!='i'&&l!='o'&&l!='u'&&l!='A'&&l!='E'&&l!='I'&&l!='O'&&l!='U') {
left++;
}else if(r!='a'&&r!='e'&&r!='i'&&r!='o'&&r!='u'&&r!='A'&&r!='E'&&r!='I'&&r!='O'&&r!='U') {
right--;
}else {
sw=s1[left];//System.out.println(sw);System.out.println(s1[right]);System.out.println(000);
s1[left]=s1[right];
s1[right]=sw;
left++;
right--;
}
}
//s=s1.toString();
// 每一个对象的toString方法,都会打印出“类名@他的hashCode值”这样的一个字符串,数组是“[”这个符号C就代表char,后面的就是这个数组的hashCode值,如果是int类型的数组的话,就会使[I@*****了
s=new String(s1);//这样是转成string
return s;
}
//为了快速判断,把所有元音字符加入到HashSet中,从而以O(1)的时间复杂度进行操作
private final static HashSet<Character> vowels=new HashSet<>(
Arrays.asList('a','e','i','o','u','A','E','I','O','U')
);
public static String reverseVowels01(String s) {
if(s==null)return null;
int left=0,right=s.length()-1;
char[] c=new char[s.length()];
//要加等号,因为我们这里是个空数组,必须把所有值都赋值进去
while(left<right) {
//循环停止条件是left=right+1
//为什么这里要加等于号,上面的就不用????
char cl=s.charAt(left);
char cr=s.charAt(right);
System.out.println(cl);System.out.println(cr);System.out.println("/");
if(!vowels.contains(cl)) {
c[left++]=cl;
}else if(!vowels.contains(cr)) {
c[right--]=cr;
}else {
c[left++]=cr;
c[right--]=cl;
}
}
return new String(c);
}
917-Reverse Only Letters
//仅仅反转字母,给定一个字符串S,返回反转后的字符串,不是字母的留在原地,所有字母位置反转
//isLetter超出时间限制,Character.valueOf()也超出时间,并不是判断字母的原因,是因为,没有在交换后左移右移,已修改!!
public static String reverseOnlyLetters(String s) {
char[] data=s.toCharArray();
int left=0,right=data.length-1;
char sss=0;
while(left<right) {
//a-z:97-122,A-Z:65-90,可以直接使用isLetter函数
if(Character.valueOf(data[left])>122||Character.valueOf(data[left])<65||(Character.valueOf(data[left])>90&&(Character.valueOf(data[left])<97))) {
left++;
}else if(Character.valueOf(data[right])>122||Character.valueOf(data[right])<65||(Character.valueOf(data[right])>90&&(Character.valueOf(data[right])<97))) {
right--;
}else {
sss=data[left];
data[left]=data[right];
data[right]=sss;
left++;right--;
}
}
s=new String(data);
return s;
}
//栈!!!!!!!!!!!!!将s的所有字母存入栈中,所以出栈等价于字母反序操作。 //遍历s所有字符,如果是字母选择栈顶输出
public String reverseOnlyLetters01(String S) {
Stack<Character> letters=new Stack();//栈!!!!!!
for(char c:S.toCharArray())
if(Character.isLetter(c))
letters.push(c);
StringBuilder ans=new StringBuilder();
for(char c:S.toCharArray()) {
if(Character.isLetter(c))
ans.append(letters.pop());
else
ans.append(c);
}
return ans.toString();//时间复杂度,空间复杂度,都是O(n)
}
925-Long Pressed Name
//输入name和typed //输入:name = “alex”, typed = “aaleex” //输出:true
//解释:‘alex’ 中的 ‘a’ 和 ‘e’ 被长按。 //示例 2: // //输入:name = “saeed”, typed =
“ssaaedd” //输出:false //解释:‘e’ 一定需要被键入两次,但在 typed 的输出中不是这样。 //示例 3: //
//输入:name = “leelee”, typed = “lleeelee” //输出:true //示例 4: //
//输入:name = “laiden”, typed = “laiden” //输出:true //解释:长按名字中的字符并不是必要的。//只能多不能少
public boolean isLongPressedName(String name,String typed) {
int i=0,j=0;
while(i<name.length()) {
if(name.charAt(i)==typed.charAt(j)){
//charAt()
i++;j++;
}else if(j>0&&typed.charAt(j)==typed.charAt(j-1)) {
//重复按,也就是和前一个相等
j++;
}else {
return false;
}
}
return i==name.length();//如果i遍历完全程就是对的
}
回文
125-Valid Palindrome
//验证回文串,只考虑字母和数字支付,忽略大小写,空字符串也是回文 //例子:输入: "A man, a plan, a canal:
Panama 输出: true //双指针,左右移动,相等移动,不是字母移动//A65,a97,差值是32
//解答错误,aa的话就是错误的,因为忘了考虑数字,加入数字aa
//这题绝对是对的!!!!!!!!!!!,但是判题通道说OP是true,用eclipse输出绝对是false
错了!!!,因为不是相差32的就是同一个字母,因为还有数字
public static boolean isPalindrome(String s) {
int left=0,right=s.length()-1;
while(left<right