今天解决了这样的一道题:
有这样的一个字符串”:ab:cde:fghi:jklmn:::12345::A”,给每个冒号间隔的字符串片段逆序排列,
即输出”:ba:edc:ihgf:nmlkj:::54321::A”,写出代码。
经过室友点拨,这道题可以分为先检索字符串片段,对片段进行逆序操作。即检索第一组片段,逆序;检索第二组片段,逆序;……。故采用递归思想,函数应包含两个步骤,第一步是检索字符串片段,第二部对该片段逆序排列。在花费大量时间后,一个是解决了这个问题,另外一个是暴露了自己基础极差的状态。
我是学Java的,用Java实现,以下是代码:
public class RecursionDepth {
static void func(StringBuffer strs, int count) {
if (count > strs.length()-1) {
return;
}
if (String.valueOf(strs.charAt(count)).equals(":")) {
count++;
} else {
int i = 0;
while(!String.valueOf(strs.charAt(count)).equals(":")) {
count++; //字符串片段计数器
if (count == strs.length()) {
break; //字符串末尾跳出
}
if (String.valueOf(strs.charAt(count)).equals(":")) {
break; //字符串片段结束跳出
}
i++; //超过两个字符的字符串片段计数加1
}
int j = 1; //临时计数器
while (i>-1 && j<=i) {
String left = String.valueOf(strs.charAt(count-i-1));
String right = String.valueOf(strs.charAt(count-j));
strs.replace(count-i-1, count-i, right);
strs.replace(count-j, count-j+1, left);
i--;
j++;
}
}
func(strs, count);
}
public static void main(String[] args) {
StringBuffer strs = new StringBuffer (":ab:cde:fghi:jklmn:::12345::A");
int count = 0; //字符串定位
func(strs, count);
System.out.println(strs);
}
}
思路虽然很好理解,但是自己动手敲的时候暴露了这么几个问题。
- 首先对Java的字符串不理解,导致面对String,不知道该如何操作其中的字符,通过百度才知道StringBuffer的replace()方法才可以替换制定位置。
- 字符串逆序操作一开始想通过逐个替换,有i个字符即需要(i-1)*i/2次,接着写代码的时候发现很难写出来(主要是不想再用变量),后来经过大量的时间思考逆序只需要首尾替换即可,才写出这样的代码。