黑马程序员技术交流社区

标题: 关于毕老师字符串练习的部分 [打印本页]

作者: 我为你着迷    时间: 2014-11-15 18:06
标题: 关于毕老师字符串练习的部分
  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. }
复制代码

大家好  就是这个练习反转不聊  始终打印的是原串  看了一下午了不知道问题出在了哪里  很是郁闷  哪位大神帮小弟看下 或者你编译下 还是我的编译器出了问题
作者: 郑飞    时间: 2014-11-15 20:12
for(int start=x-1,end=y-1;start<end;start++,end--) //x也要-1
作者: 我为你着迷    时间: 2014-11-15 20:29
郑飞 发表于 2014-11-15 20:12
for(int start=x-1,end=y-1;start

不对呀 x不用减1啊
作者: 我为你着迷    时间: 2014-11-15 20:32
:'(跪求大神帮我解答下  急死了
作者: 眸眼前缘    时间: 2014-11-15 20:41
加油。赞一个。
作者: 我为你着迷    时间: 2014-11-15 20:57
眸眼前缘 发表于 2014-11-15 20:41
加油。赞一个。

哥  你赞啥呀  你要是明白什么原理  就帮我解答下  好吗  就这一个BUG我都快崩溃了
作者: yangsing0    时间: 2014-11-15 21:24
加油。赞一个。
作者: 计算机小菜鸟    时间: 2014-11-15 21:30
把输出语句改为     System.out.println(reverseString(s,0,s.length()));
作者: 我为你着迷    时间: 2014-11-15 21:50
计算机小菜鸟 发表于 2014-11-15 21:30
把输出语句改为     System.out.println(reverseString(s,0,s.length()));

哥们 你这是把整个字符串进行反转了 而我要的是一部分   但是这个代码反转前和反转后的输出结果都是一样的     你要不你自己编译下 研究下 好不好  
作者: rel4x    时间: 2014-11-15 22:41
包括头不包括尾
作者: 郑飞    时间: 2014-11-15 22:49
你把X-1试试啊 我这是可以  还有你第6,第7字符都是空白

作者: 计算机小菜鸟    时间: 2014-11-15 22:50
我为你着迷 发表于 2014-11-15 21:50
哥们 你这是把整个字符串进行反转了 而我要的是一部分   但是这个代码反转前和反转后的输出结果都是一样 ...

你移动的位置都在空格里面当然没变化了!!
作者: 王世虎    时间: 2014-11-15 22:52
哥们仔细研究了一下你的代码,道理是没有错误,但是有个地方有问题
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.
作者: DamonZh    时间: 2014-11-15 23:02
31行 y不用减1  你的x是6  y是7 如果y减1  start和end岂不都是6 ,for就不会执行了呀
作者: 我为你着迷    时间: 2014-11-15 23:42
王世虎 发表于 2014-11-15 22:52
哥们仔细研究了一下你的代码,道理是没有错误,但是有个地方有问题
System.out.println(reverseString(s,6, ...

其实 还有这里   start++,end--    这里也不是很明白  能在帮我解释下嘛  谢谢了
作者: 郑飞    时间: 2014-11-15 23:45
我为你着迷 发表于 2014-11-15 23:42
其实 还有这里   start++,end--    这里也不是很明白  能在帮我解释下嘛  谢谢了 ...

就是头尾不断靠拢的同时做着头尾交换 一直交换到start和end并到一起 实现反转
作者: 十万一千    时间: 2014-11-16 00:44
我看毕姥爷的方法有点不好理解,就自己想了一个。。。
  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-16 07:55
十万一千 发表于 2014-11-16 00:44
我看毕姥爷的方法有点不好理解,就自己想了一个。。。

{:3_63:}你这个更加不好理解  我都看蒙了  好嘛
作者: 王世虎    时间: 2014-11-16 11:23
我为你着迷 发表于 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 11:33
王世虎 发表于 2014-11-16 11:23
比如说star为6  end为9  在操作反转换位的时候
先6和9换位置;
然后执行 start++,end--也就是7和8再换位 ...

谢谢你啊 辛苦了
作者: 王世虎    时间: 2014-11-16 11:35
我为你着迷 发表于 2014-11-16 11:33
谢谢你啊 辛苦了

应该的咱们相互交流,希望能早日进黑马
作者: 十万一千    时间: 2014-11-16 12:32
我为你着迷 发表于 2014-11-16 07:55
你这个更加不好理解  我都看蒙了  好嘛

和毕姥爷的算法效果是相同的,也是包括头不包括尾。反转字符我用字符数组充当了缓冲区,没做swap操作,myReverse(String string, Integer startIndex, Integer endIndex) 实质是一个拼接字符串的动作,里面调了myReverse(String string)
作者: zhangyangLengen    时间: 2014-11-16 14:58
自己试过了,改了       
String s = "                zhangyang                ";

System.out.println("---"+reverseString(s, 0, s.length())+"---");
大体的思路是对的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2