对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如"Hello World"变形后就变成了"wORLD hELLO"。
输入描述: 给定一个字符串s以及它的长度n(1≤n≤500)
输出描述: 请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
输入例子: "This is a sample",16
输出例子: "SAMPLE A IS tHIS"
这是4.19日牛客网“一战通offer”互联网实习季编程挑战的第一题,当时我的代码如下,通过率不能达到100%:
public static String toStrArr(String s,int n){
String newStr = reverseCases(s,n);
String[] array = null;
array = newStr.split(" ");
StringBuffer str = new StringBuffer();
for (int i = array.length-1; i >= 0; i--) {
str.append(array[i]+" ");
}
return str.toString().trim();
}
public static String reverseCases(String s,int n){
StringBuffer result = new StringBuffer();
char[] chArray = s.toCharArray();
String[] ch = new String[chArray.length];
for(int i=0;i<n;i++){
if(chArray[i]<97){
ch[i] = (chArray[i]+"").toLowerCase();
}else {
ch[i] = (chArray[i]+"").toUpperCase();
}
result.append(ch[i]) ;
}
return result.toString().trim();
}
今天再来看的时候,原来,测试用例有这样的情况:
测试用例:
" h i",4
对应输出应该为:
"I H "
你的输出为:
"I H"
下面是重新编辑的代码:
public class Main {
public static String toStrArr(String s,int n){
char[] cArr = s.toCharArray();
reverse(cArr,0,n-1); //对整个字符串进行反转,比如:this is a sample 变成 elpmas a si siht
reverseCase(cArr,n); //大小写字母变换
int begin = 0; //用begin来记录字符串中不是空格的第一个字符下标
for(int i =0;i<n;i++){<span> </span>//找出第一个不是空格的字符下标
if(cArr[i] != ' '){
begin = i;
break;
}
}
for(int i =begin;i<n;i++){
if(cArr[i]==' '){
reverse(cArr,begin,i-1);<span> </span>//对每个单词进行翻转
begin=i+1;
}
}
reverse(cArr,begin,n-1); //对最后一个单词反转
String result = new String(cArr);
System.out.println(result);
return result;
}
public static void reverse(char[] cArr,int front,int end){
char temp;
while(front<end){
temp = cArr[front];
cArr[front]=cArr[end];
cArr[end]=temp;
front++;
end--;
}
}
public static void reverseCase(char[] cArr,int n){
for (int i = 0; i < n; i++) {
if(cArr[i]!=' '){
if(cArr[i]<97){ //也就是大写字母
cArr[i]+=32;
}else{
cArr[i]-=32;
}
}
}
}
public static void main(String[] args) {
toStrArr(" This is a sample",17);
}
}