【问题标题】:Java- understanding the logic of reverse in arrayJava-理解数组中逆向的逻辑
【发布时间】:2019-03-12 18:13:38
【问题描述】:

我有一个动态字符串类,它有一个字符数组text,它有一个可以反转数组内容的reverse() 方法。

但我不明白算法如何工作的逻辑。你能帮我看一下代码吗?

public void reverse() {
  char tmp;
    for(int i=0; i<length/2; i++) {
      tmp = text[i];
      text[i] = text[length-1-i];
      text[length-1-i] = tmp;
    }
 } 

【问题讨论】:

  • 拿一张纸跟踪数组和i 的值,或者使用调试器逐行逐行执行代码。
  • 如果您不理解算法,那么理解它的最佳方法是使用笔和纸并跟踪步骤。为不同的例子做这件事,你就会明白发生了什么。

标签: java arrays reverse


【解决方案1】:

让我们取一个字符串并尝试反转它。字符串是“编码器”

length = 字符串长度 = 5(在这种情况下)

length/2 = 5/2 = 2(它不会是 2.5,因为我们是在除以两个整数) 所以 for 循环从 0 到 2 (0,1, NOT 2)

i = 0 时:

temp = 'c' text[0] 现在将保留text[5 - 1 - 0]

所以现在文本是“roder”(中间答案)

text[4] 现在将持有 'c' 所以现在文本是“rodec”

i = 1 时:

temp = 'o' text[1] 现在将保留 text[5 - 1 - 1]

所以现在文本是“redec”(中间答案)

text[3] 现在将持有 'o'

所以现在文本是'redoc'

for 循环直到length/2 的原因是,我们正在交换两端的字符,并在中间停止。

我希望这会有所帮助。现在尝试使用更长的字符串并按照相同的步骤操作。

【讨论】:

  • 非常感谢!多亏了你,我现在才明白它是如何工作的。顺便说一句,我不只是在这里发布我的问题,而没有试图努力研究它是如何工作的。我确实尝试过算法,但我就是无法理解。
【解决方案2】:

你应该像这样思考和调试循环中的所有步骤

Char[] text ='abcd'
text.length = 4

第一步,

temp = 'a' 
text[0] = text[3] // text[0] = 'd'
text[3] = temp // text[3] = 'a'
// your text = 'dbca'

第二步,

temp = 'b'
text[1] = 'c'
text[2] = 'b'
// your text = 'dcba'

两次可以找到反转的文字 -> size/2

【讨论】:

  • 代码中最让我困惑的是行 text[i] = text[length-1-i];。我是否认为将 forloop 长度除以一半的原因是因为它一次交换 2 个数字。最后一个到第一个等等。
  • 如果你使用 text[length-i],你会得到 arrayindexoutofboundsexception。因为数组从零开始,但您的文本长度等于 array.size+1
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多