面试题(测试工程师的面试题):
有一个类似:“this is a book !”的字符串,要求把字符串反转成“! book a is this”,反转单词倒是好说,但是要求两个单词中的空格数不一定,而且不能有缺失
思路:
先把字符串切割成一个字符串数组,按照“”进行切割。或者转成char[] 也是可以的
然后再去遍历这个数组
如果当前的字符串不是" “,就一直添加到一个StringBuffer中,如果遍历到了空格,就说明单词结束了,就将这个单的StringBuffer添加到一个List中,并且把这个StringBuffer置空
如果当前的字符串是” ",就一直添加另一个StringBuffer中,如果遍历到字母,就说明不定长的空格结束了,就将这个不定长的空格字符串继续加到List中,然后置空这个StringBuffer()这样list中的元素不是单词就是一个不定长的空格,但是要注意,因为每次的添加操作都是在下一次遍历时进行,所以最后一个单词或者空格要单独做处理,然后反转这个list即可
表达能力有限,描述的不明不白,直接上代码吧
代码:
// 反转字符串
// "this is a book , is very good !" 反转成 "! good very is , book a is this"
// 坑:中间的空格不确定,但是反转后不能丢失空格,以单词维度进行反转
public String reverse(String str){
String [] strArray = str.split("");
// 装载每一个单词
StringBuffer word = new StringBuffer();
// 装载每一个不定长的空格
StringBuffer space = new StringBuffer();
// 最终的反转字符串
StringBuffer reverseStr = new StringBuffer();
// 每一个单词或者空格,按照顺序添加到该list中
List<String> finalStr = new ArrayList<>();
// 不用增强for,因为遍历到最后一次,要做单独处理,要通过索引判断最后一次的遍历
for (int i = 0; i < strArray.length; i++) {
// 判断当前字符串是空格还是字母,都做累加,但是在各自的if分支中,如果遇到切换(字母到空格,空格到字母)的情况,证明单词拼接完成,或者不定长的空格结束了,就要将这个字符串添加到list中,并且当前的StringBuffer
if (!strArray[i].equals(" ")){
if (space.length() != 0){
finalStr.add(space.toString());
space.setLength(0);
}
word.append(strArray[i]);
}else {
if (word.length() != 0){
finalStr.add(word.toString());
word.setLength(0);
}
space.append(" ");
}
// 对最后一次的数据进行处理,由于每次添加到list中都是在下一次判断中生效,所以在遍历最后一个字符串的时候,单独处理
if (i == strArray.length-1){
finalStr.add(word.length() == 0 ? space.toString() : word.toString());
}
}
// 倒序添加到StringBuffer
for (int i = finalStr.size(); i > 0; i--) {
reverseStr.append(finalStr.get(i-1));
}
return reverseStr.toString();
}
调用
@Test
public void test999(){
String s = " this is a book , is very good ! ";
System.out.println(reverse(s));
}