A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我为你着迷 金牌黑马   /  2014-11-15 18:06  /  1752 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. //将字符串的一部分反转

  2. class StringTest3
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 String s="       ab cd   ";
  7.           
  8.           System.out.println(reverseString(s,6,7));
  9.           //System.out.println(reverseString(s));
  10.         }
  11.   
  12.   public static String reverseString(String s,int start,int end)
  13.   {
  14.                   char[] chs=s.toCharArray();
  15.                  
  16.                   reverse(chs,start,end);       
  17.                  
  18.                   return new String(chs);
  19.   }
  20.   
  21.   public static String reverseString(String s)
  22.   {
  23.           //return reverseString(s,0,s.length());//把整串反转       
  24.           return "";
  25.   }       
  26.   

  27. private static void reverse(char[] arr,int x,int y)
  28.   {
  29.           for(int start=x,end=y-1;start<end;start++,end--)
  30.     {
  31.             swap(arr,start,end);
  32.     }       
  33.   }
  34.   
  35.   private static void swap(char[] arr,int x,int y)
  36.   {
  37.           char temp=arr[x];
  38.           arr[x]=arr[y];
  39.           arr[y]=temp;       
  40.   }
  41. }
复制代码

大家好  就是这个练习反转不聊  始终打印的是原串  看了一下午了不知道问题出在了哪里  很是郁闷  哪位大神帮小弟看下 或者你编译下 还是我的编译器出了问题

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

22 个回复

正序浏览
自己试过了,改了       
String s = "                zhangyang                ";

System.out.println("---"+reverseString(s, 0, s.length())+"---");
大体的思路是对的
回复 使用道具 举报
我为你着迷 发表于 2014-11-16 07:55
你这个更加不好理解  我都看蒙了  好嘛

和毕姥爷的算法效果是相同的,也是包括头不包括尾。反转字符我用字符数组充当了缓冲区,没做swap操作,myReverse(String string, Integer startIndex, Integer endIndex) 实质是一个拼接字符串的动作,里面调了myReverse(String string)
回复 使用道具 举报

应该的咱们相互交流,希望能早日进黑马
回复 使用道具 举报
王世虎 发表于 2014-11-16 11:23
比如说star为6  end为9  在操作反转换位的时候
先6和9换位置;
然后执行 start++,end--也就是7和8再换位 ...

谢谢你啊 辛苦了
回复 使用道具 举报
我为你着迷 发表于 2014-11-15 23:42
其实 还有这里   start++,end--    这里也不是很明白  能在帮我解释下嘛  谢谢了 ...

比如说star为6  end为9  在操作反转换位的时候
先6和9换位置;
然后执行 start++,end--也就是7和8再换位置;
再次执行start++,end--
此时判断for循环的条件start<end就不满足了。
这里用start++,end--来遍历所需换位的字符。
start++对应的是end--
相当于数组中遍历的方法。
回复 使用道具 举报
十万一千 发表于 2014-11-16 00:44
我看毕姥爷的方法有点不好理解,就自己想了一个。。。

{:3_63:}你这个更加不好理解  我都看蒙了  好嘛
回复 使用道具 举报
我看毕姥爷的方法有点不好理解,就自己想了一个。。。
  1. public static String myReverse(String string) {
  2.                 Integer stringLength = string.length();
  3.                 char[] cc = new char[stringLength];
  4.                 for (int i = 0; i < stringLength; i++) {
  5.                         cc[stringLength - i - 1] = string.charAt(i);
  6.                 }
  7.                 return new String(cc);
  8.         }

  9.         public static String myReverse(String string, Integer startIndex, Integer endIndex) {
  10.                 if (startIndex <= endIndex && startIndex <= string.length() && endIndex <= string.length()) {
  11.                         return string.substring(0, startIndex) + myReverse(string.substring(startIndex, endIndex)) + string.substring(endIndex, string.length());
  12.                 } else {
  13.                         throw new ArrayIndexOutOfBoundsException();
  14.                 }
  15.         }
复制代码



回复 使用道具 举报
郑飞 高级黑马 2014-11-15 23:45:55
16#
我为你着迷 发表于 2014-11-15 23:42
其实 还有这里   start++,end--    这里也不是很明白  能在帮我解释下嘛  谢谢了 ...

就是头尾不断靠拢的同时做着头尾交换 一直交换到start和end并到一起 实现反转
回复 使用道具 举报
王世虎 发表于 2014-11-15 22:52
哥们仔细研究了一下你的代码,道理是没有错误,但是有个地方有问题
System.out.println(reverseString(s,6, ...

其实 还有这里   start++,end--    这里也不是很明白  能在帮我解释下嘛  谢谢了
回复 使用道具 举报
31行 y不用减1  你的x是6  y是7 如果y减1  start和end岂不都是6 ,for就不会执行了呀

评分

参与人数 1黑马币 +10 收起 理由
我为你着迷 + 10 嗯 明白了 谢谢哦

查看全部评分

回复 使用道具 举报
哥们仔细研究了一下你的代码,道理是没有错误,但是有个地方有问题
System.out.println(reverseString(s,6,7));你想把6和7角标的字符换位置
此时这段换位代码中的for循环根本不会调用swap方法  
private static void reverse(char[] arr,int x,int y)
  {
          for(int start=x,end=y-1;start<end;start++,end--)
    {
            swap(arr,start,end);
    }        
  }
这个地方中int x,和int y的值 为6,7且start=x,end=y-1;  所以start<end是不对的。
由于你把 这句话注释掉了(//return reverseString(s,0,s.length());//把整串反转)
所以建议end=y-1改为y就行了,或者是上面那哥们说的start=x-1也行,看你把X,Y看做什么
如果是角标 那么Y-1改为Y 如果是长度那就X-1.

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
我为你着迷 + 10 哥们 谢谢你
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我为你着迷 发表于 2014-11-15 21:50
哥们 你这是把整个字符串进行反转了 而我要的是一部分   但是这个代码反转前和反转后的输出结果都是一样 ...

你移动的位置都在空格里面当然没变化了!!
回复 使用道具 举报
郑飞 高级黑马 2014-11-15 22:49:20
11#
你把X-1试试啊 我这是可以  还有你第6,第7字符都是空白
回复 使用道具 举报
rel4x 中级黑马 2014-11-15 22:41:10
10#
包括头不包括尾
回复 使用道具 举报
计算机小菜鸟 发表于 2014-11-15 21:30
把输出语句改为     System.out.println(reverseString(s,0,s.length()));

哥们 你这是把整个字符串进行反转了 而我要的是一部分   但是这个代码反转前和反转后的输出结果都是一样的     你要不你自己编译下 研究下 好不好  
回复 使用道具 举报
把输出语句改为     System.out.println(reverseString(s,0,s.length()));
回复 使用道具 举报
加油。赞一个。
回复 使用道具 举报

哥  你赞啥呀  你要是明白什么原理  就帮我解答下  好吗  就这一个BUG我都快崩溃了
回复 使用道具 举报
加油。赞一个。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马