您的位置:首页 > 理论基础 > 数据结构算法

算法练习:字符串原地逆序(in-place reverse)(只用基本数据结构)

2013-07-17 11:05 190 查看
package codinginterview;

/**
* JAVA字符串逆序,只使用基本的数据结构
* 不使用额外空间,不使用字符串追加
* @author mingdong.cheng
*
*/
public class ReverseStr {

/**
* 字符串逆序
* 使用中间变量交换
* O(n)
* @param s
* @return
*/
public static String reverse(String s){
char[] c=s.toCharArray();
int n=c.length;
for(int i=0; i<n/2; ++i){
char t=c[i];
c[i]=c[n-i-1];
c[n-i-1]=t;
}
return String.valueOf(c);
}

/**
* 字符串原地逆序(in-place reverse)
* 不允许使用中间变量
* 用^(异或)位运算原地交换
* O(n)
* @param s
* @return
*/
public static String reverse2(String s){
char[] c=s.toCharArray();
int n=c.length;
for(int i=0; i<n/2; ++i){
c[i]=(char) (c[i]^c[n-i-1]);
c[n-i-1]=(char) (c[i]^c[n-i-1]);
c[i]=(char) (c[i]^c[n-i-1]);
}
return String.valueOf(c);
}

/**
* 数组原地交换
* 不申请额外空间
* O(n)
* @param c
* @param p
* @param q
* @return
*/
public static char[] swap(char[] c,int p,int q){
while(p<q){
c[p]=(char) (c[p]^c[q]);
c[q]=(char) (c[p]^c[q]);
c[p]=(char) (c[p]^c[q]);
p++;
q--;
}
return c;
}

/**
* 给定一个句子或段落,按单词将该字符串逆序
* 算法思想:
* 1.先按单词逆序(空格为单词边界);
* 2.再按整个句子逆序
* O(n)
* @param s
* @return
*/
public static String reverseParagraph(String s){
if(s==null||s.length()<2)
return s;
char[] c=s.toCharArray();
int bound=0;
int len=c.length;
for(int i=0;i<len;i++){
if(c[i]==' '){
swap(c, bound, i-1);
bound=i+1;
}
}
//最后单词可能不以空格结尾,将单独处理
if(c[len-1]!=' '){
swap(c,bound,len-1);
}
//对整个句子逆序
swap(c,0,len-1);

return String.valueOf(c);
}

public static void main(String[]args){
String s = "abcdefg1234567890";
String s2=" i am danielcheng .  i am coding ... hello world";
System.out.println(reverse2(s));
System.out.println(reverseParagraph(s2));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐