面试的时候遇到了类似的题,在面试官的引导下算是做出来了。
题目:
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
示例 1:
输入:"ab-cd"
输出:"dc-ba"
示例 2:
输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"
示例 3:
输入:"Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-only-letters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:优化前
public static String reverseOnlyLetter(String s) {
char[] ss = s.toCharArray();
if(s==""){
return "";
}else if (s==null){
return null;
}
int i = 0;
int j = ss.length-1;
while(i<j){
//优化点:把isNum用函数Character.isLetter()代替
if (!isNum(ss[i])){
i++;
}
if(!isNum(ss[j])){
j--;
}
if(isNum(ss[j])&&isNum(ss[i])){
char temp = ss[i];
ss[i]=ss[j];
ss[j]=temp;
i++;j--;
}
}
//优化点:可以使用 String.valueOf(ss); 把char数组转换成string 优化之后时间从2s 提升到1s
String res ="";
for (int k = 0;k<ss.length;k++){
res+=Character.toString(ss[k]);
}
return res;
}
public static boolean isNum(char c){
if(c>='A'&&c<='Z'){
return true;
}else if(c>='a'&&c<='z'){
return true;
}else{
return false;
}
}
优化点1.优化点:把isNum用函数Character.isLetter()代替
优化点2.可以使用 String.valueOf(ss); 把char数组转换成string 优化之后时间从2s 提升到1s
简单优化后的代码:
public class Solution {
public static String reverseOnlyLetters(String s) {
char[] ss = s.toCharArray();
if(s==""){
return "";
}else if (s==null){
return null;
}
int i = 0;
int j = ss.length-1;
while(i<j){
if ((!Character.isLetter(ss[i]))){
i++;
}
if(!Character.isLetter(ss[j])){
j--;
}
if(Character.isLetter(ss[j])&&Character.isLetter(ss[i])){
char temp = ss[i];
ss[i]=ss[j];
ss[j]=temp;
i++;j--;
}
}
return String.valueOf(ss);
}
测试用例
public static void main(String[] args) {
System.out.println(reverseOnlyLetters(";1yDV"));
System.out.println(reverseOnlyLetters("aw333q1"));
System.out.println(reverseOnlyLetters("7_28]"));
System.out.println(reverseOnlyLetters("z<*zj"));
System.out.println(reverseOnlyLetters(""));
}