Java实现 字符串变形
字符串变形
http://www.nowcoder.com/practice/c3120c1c1bc44ad986259c0cf0f0b80e
思路:
- 不使用语言中的 API,而是自己编写对应的函数。
- 将字母大小写转换后,反转整个字符串,再反转每个单词。
- 注意JAVA的字符串不可变,对于字符串不可变的语言,首先得把字符串转化成其他可变的数据结构.。
- 注意下标不要越界。
复杂度:
时间复杂度 O(n) ,需要 O(n) 的空间来存储字符串空间复杂度O(n)
代码实现(Java)
public class Solution {
public String trans(String s, int n) {
StringBuilder sb=new StringBuilder(s);
//单词大小写反转
int i=0;
char tmp;
while(i<n) {
tmp=sb.charAt(i);
if('A'<=tmp&&tmp<='Z') sb.setCharAt(i, (char) (tmp+32));
else if('a'<=tmp&&tmp<='z') sb.setCharAt(i, (char) (tmp-32));
i++;
}
//翻转字符串
reverse(sb,0,n-1);//自定义方法
//翻转每个单词
reverseEachWord(sb);//自定义方法
return sb.toString();
}
private void reverse(StringBuilder sb,int left,int right) {
while(left<right) {
char tmp=sb.charAt(left);
sb.setCharAt(left++, sb.charAt(right));
sb.setCharAt(right--, tmp);
}
}
private void reverseEachWord(StringBuilder sb) {
int n=sb.length();
int start=0,end=0;
while(start<n) {
//循环至单词的末尾
while(end<n&&sb.charAt(end)!=' ') {
end++;
}
reverse(sb,start,end-1);//翻转单词
start=end+1;//更新start,去找下一个单词
++end;
}
}
}