黑马程序员技术交流社区

标题: 数组反转问题 [打印本页]

作者: 邢晏玮    时间: 2012-11-6 18:16
标题: 数组反转问题
本帖最后由 邢晏玮 于 2012-11-9 15:54 编辑
  1. public class Fz
  2. {
  3.         public static void zh(char[] chr)
  4.         {
  5.                 for(int start = 0,end = chr.length-1;start<end;start++,end--)
  6.                 {
  7.                         swp(chr,start,end);
  8.                 }
  9.         }
  10.         public static void swp(char[] chr,int x,int y)
  11.         {
  12.                 char temp = chr[x];
  13.                 chr[x] = chr[y];
  14.                 chr[y] = temp;
  15.         }
  16.         public static String Fz(String s)
  17.         {
  18.                 char[] chr = s.toCharArray();
  19.                 zh(chr);
  20.                 return new String(chr);
  21.         }
  22.         public static void sop(String s)
  23.         {
  24.                 System.out.println(s);
  25.         }
  26.         public static void main(String args[])
  27.         {
  28.                 String s = "abcdefg";
  29.                 sop("("+s+")");
  30.                 sop("("+Fz(s)+")");
  31.         }
  32. }
复制代码
能否帮我讲解下是怎么翻转的  就是在这个地方不是很明白
  1. <p>public static void zh(char[] chr)
  2.         {
  3.         for(int start = 0,end = chr.length-1;start<end;start++,end--)
  4.         {</p>
复制代码

作者: 朱宏青    时间: 2012-11-6 19:53
本帖最后由 朱宏青 于 2012-11-6 20:00 编辑

很简单啊.
  1. public static void zh(char[] chr)
  2.         {
  3.                 for(int start = 0,end = chr.length-1;start<end;start++,end--)
  4.                 {
  5.                         swp(chr,start,end);
  6.                 }
  7.         }
复制代码
首先要明白swp()这个方法产生的是什么效果:录入一个数组,将chr[start]于chr[end]这两个数组数据进行互换.这点没有争议吧?

然后就是看这个for循环产生的是什么效果:start记录数组前端的下标.end记录数组后端的下标.每循环一次运行一次,start++  end--   ---->前端的下标越来越大,后端的下标越来越小 两者的差距越来越小 直到start >end 有问题么?

举个例子:123456789.每次拿前面的跟后面的互换,每互换一次前面的往后拿一位,后面的往前拿一位.最后的结果呢?987654321.

就是这样.
作者: 冯纪纲    时间: 2012-11-6 23:35
public static void zh(char[] chr)
        {
        for(int start = 0,end = chr.length-1;start<end;start++,end--)
                        swp(chr,start,end);
         }

上面的这句代码其实就是for循环的巧应用。start指的是这个数组的第一个元素,所以其初始值为0,
end指的是该数组的最后一个元素,所以其初始值为:数组的长度-1。想要实现数组的反转,其实就是把数组的第一个
元素和最后一个元素交换位置,第二个元素和倒数第二个个元素交换位置,...注意:这个逻辑关系就出来了。
每执行一次start++,end--就会把数组的前面的元素和后面的元素给对应起来,就是从头部和从尾部同时向中间靠拢,然后进行交换,直到start<end;
只是把具体的两个数的交换给单独封装成一个swp方法了,这样的代码更有可读性,结构也很清晰。

推荐您打个断点,然后用dbug的方式,观察一下end和start的值的变化,会明白的更彻底滴 呵呵

作者: 杨志男    时间: 2012-11-7 15:24
  1. public static void zh(char[] chr)

  2.         {

  3.                 for(int start = 0,end = chr.length-1;start<end;start++,end--)

  4.                 {

  5.                         swp(chr,start,end);

  6.                 }

  7.         }
复制代码





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