一个字符串如:I like China very much !~
要求,字符串以单词为单位进行反转,并且必须保留原有分隔符及其个数
例如:上述字符串反转后为:!~ much very China like I
思路:
1. 遍历字符串,将字符串切割成两个ArrayList,一个Integer类型的intList保存splitSymbol的个数,一个String类型的strList保存单词
2. strList.size-intList=1
3. 将strList和intList倒序交替写入一个新的String。
具体代码如下:
package base.algorithm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ReverseStrWithSpace {
private final static char splitSymbol = ' ';
public static void main(String[] args) {
String target = "I like China very much ~!";
reverseStrWitchSpace(target,splitSymbol);
}
private static String constructStrFromMap(Map<String, List> listMap)
{
List<Integer> intList = listMap.get("intList");
List<String>strList = listMap.get("strList");
String retStr="";
for(int index=strList.size()-1;index>=0;index--)
{
if(index>0)
{
retStr+=strList.get(index);
for(int count=0;count<intList.get(index-1);count++)
{
retStr+=new String(new char[]{splitSymbol});
}
}
else {
retStr+=strList.get(0);
}
}
System.out.println(retStr);
return retStr;
}
public static String reverseStrWitchSpace(String target,char splitSymbol)
{
Map<String, List>listMap = new HashMap<String, List>();
if(target==null||target.length()==0)
{
System.out.println("目标字符串为空");
return null;
}
int intCount = 0;
int start = 0;
int end = 0;
List<Integer> intList = new ArrayList<Integer>();
List<String> strList = new ArrayList<String>();
for(int index=0;index<target.length();index++)
{
boolean lastChar = index==target.length()-1?true:false;
if(target.charAt(index)==splitSymbol)
{
intCount++;
if (lastChar) {
intList.add(intCount);
listMap.put("intList", intList);
listMap.put("strList", strList);
return constructStrFromMap(listMap);
}
if (target.charAt(index+1)!=splitSymbol) {
intList.add(intCount);
listMap.put("intList", intList);
start=index+1;
}
}
else {
end=index;
if (lastChar) {
strList.add(target.substring(start, end+1));
listMap.put("intList", intList);
listMap.put("strList", strList);
return constructStrFromMap(listMap);
}
if (target.charAt(index+1)==splitSymbol) {
strList.add(target.substring(start, end+1));
listMap.put("strList", strList);
intCount = 0;
}
}
}
return constructStrFromMap(listMap);
}
}