面试- 字符串反转 单词不反转

面试题目: 
I lover your name  变成: name your lover I  

我的做法:(我是考虑到传递的分割串可能为多个字符) 

Java代码   收藏代码
  1. package com.data;  
  2.   
  3. /** 
  4.  * 字符串反转 源字符串:I lover your name 反转后:name your lover I 
  5.  *  
  6.  * 思路:从name 的e开始检索lenth长度为sep的字符串,比较和sep是否一致 
  7.  * @author xinchun.wang 
  8.  *  
  9.  */  
  10. public class ReverseString {  
  11.   
  12.     /** 
  13.      * 字符串反转 
  14.      * @param srcString   源字符串 
  15.      * @param sep  分隔符 
  16.      * @return 反转后的字符串 
  17.      */  
  18.     public static String reverse(String srcString, String sep) {  
  19.         StringBuilder returnBuilder = new StringBuilder();  
  20.         int length = sep.length(); // 分隔串的长度  
  21.         int begin = 0// targetString 的结束位置  
  22.         int end = srcString.length();// targetString 的开始位置  
  23.         for (int i = srcString.length(); i >= 0;) {  
  24.             begin = i;  
  25.             if (i - length <= 0) { //如果i -length <= 0,那么可以认定可以直接拼接返回结果了   
  26.                 returnBuilder.append(srcString.substring(0, end));  
  27.                 return returnBuilder.toString();  
  28.             }  
  29.             String tempSep = srcString.substring(i - length, i); //获取可能的分隔串  
  30.             if (!tempSep.equals(sep)) { //如果不和分割串一致,那么从i-1的位置继续检索  
  31.                 i = i - 1;  
  32.                 continue;  
  33.             }  
  34.             String target = srcString.substring(begin, end);  
  35.             returnBuilder.append(target).append(" ");  
  36.             end = i - length;  
  37.             i = i - length;  
  38.         }  
  39.         return returnBuilder.toString();  
  40.     }  
  41.   
  42.     public static void main(String[] args) {  
  43.         String result = reverse("I lover your name"" ");  
  44.         System.out.println(result);  
  45.     }  
  46. }  


更好的做法: 
无需申请占用更多的空间,效率也较高,复杂度增加!! 
这个算法可以兼容各自分隔符,任何分隔串都是可以的
Java代码   收藏代码
  1. package com.data;  
  2.   
  3. /** 
  4.  * 字符串反转 源字符串:I lover your name 反转后:name your lover I 
  5.  *  
  6.  * 思路:从name 的e开始检索lenth长度为sep的字符串,比较和sep是否一致 
  7.  *  
  8.  * @author xinchun.wang 
  9.  *  
  10.  */  
  11. public class ReverseString2 {  
  12.   
  13.     /** 
  14.      * 字符串反转 
  15.      * @param srcString   源字符串 
  16.      * @param sep    分隔符 
  17.      * @return 反转后的字符串 
  18.      */  
  19.     public static void reverse(char[] data, int begin, int end, String sep) {  
  20.         for (int i = begin; i < (begin+(end-begin+1)/2); i++) {  
  21.             char temp = data[i];  
  22.             data[i] = data[(end - i)+begin];  
  23.             data[(end - i)+begin] = temp;  
  24.         }  
  25.         if (sep == null) {  
  26.             return;  
  27.         }  
  28.         int sepLength = sep.length();  
  29.         int tempBegin = begin;  
  30.         int tempEnd = end;  
  31.         for (int i = begin; i <= end; i++) {  
  32.             int index = 0;  
  33.             boolean flag = true// 标识是否匹配  
  34.             for (int j = i; j <= end && index < sepLength; j++,index++) {  
  35.                 if (data[j] == sep.charAt(index)) {  
  36.                     flag = true;  
  37.                     if (index == sepLength - 1) {  
  38.                         break;  
  39.                     }  
  40.                 } else {  
  41.                     flag = false;  
  42.                     break;  
  43.                 }  
  44.             }  
  45.             if (flag) { //如果完全匹配了,那么  
  46.                 tempEnd = i-1;  
  47.                 reverse(data, tempBegin, tempEnd, null);  
  48.                 tempBegin = i + sepLength;  
  49.             }  
  50.             if (i == end) {  
  51.                 tempEnd = i;  
  52.                 reverse(data, tempBegin, tempEnd, null);  
  53.             }  
  54.         }  
  55.     }  
  56.     public static void main(String[] args) {  
  57.         char[] data = "abc def 123 7879 45".toCharArray();  
  58.         reverse(data, 0, data.length - 1" ");  
  59.         System.out.println(new String(data));  
  60.     }  
  61. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值