【问题标题】:Reversing the order of a string反转字符串的顺序
【发布时间】:2014-03-01 14:28:48
【问题描述】:

所以我仍然对基本 java 的工作原理感到不安,这是我编写的一个方法,但不完全理解它是如何工作的,有人愿意解释吗?

它应该取一个 s in 的值并以相反的顺序返回它。

编辑:主要是 for 循环让我感到困惑。

假设我输入“12345”,我希望我的输出为“54321”

Public string reverse(String s){
 String r = "";
 for(int i=0; i<s.length(); i++){
   r = s.charAt(i) + r;
}
  return r;
}

【问题讨论】:

  • 哪一部分不清楚?
  • 每次执行r = s.charAt(i) + r; 时都会在内存中创建一个新字符串,旧字符串会被垃圾回收。实在是太低效了。
  • 抱歉应该在问题中指定,我不清楚 for 循环。
  • 如果您在纸上跟踪执行情况,您可以轻松了解正在发生的事情。在循环中,您首先创建 1,然后附加 21 等...
  • Mainly the for loop is what is confusing me 这对我们没有帮助,因为除了创建临时变量并返回它,循环只剩下一部分了。您是否尝试过在纸上迭代此代码?只需拿起笔,写下哪行代码会处理变量。

标签: java string reverse


【解决方案1】:

我们对 String a 的最后一个索引进行 for 循环,add tha carater of index i 到 String s ,add 这里是一个连接:

示例

String z="hello";
String x="world";

==> x+z="world hello" #different to z+x ="hello world"

你的情况:

String s="";
String a="1234";
s=a.charAt(0)+s ==> s= "1" + "" = "1" ( + : concatenation )
s=a.charAt(1)+s ==> s='2'+"1" = "21" ( + : concatenation )
s=a.charAt(2)+s ==> s='3'+"21" = "321" ( + : concatenation )
s=a.charAt(3)+s ==> s='3'+"321" = "4321" ( + : concatenation )

等等。

public String reverse(String s){
         String r = ""; //this is the ouput , initialized to " "
         for(int i=0; i<s.length(); i++){  
           r = s.charAt(i) + r; //add to String r , the caracter of index i 
        }
          return r;
        }

【讨论】:

  • 这真的很有帮助!我认为让我感到困惑的是 charAt(i) 是模糊的,我不明白它来自哪里。但是这篇文章向我展示了它的来源以及字符串是如何被调用和组合在一起的。谢谢!
【解决方案2】:

这段代码的作用如下

创建一个新变量 r="";

然后循环输入长度的字符串,它在 r 的开头添加循环的当前字符。

  • i=0) r="1"
  • i=1) r="21"
  • i=2) r="321"
  • i=3) r="4321"
  • i=4) r="54321"

【讨论】:

    【解决方案3】:

    当您进入循环时,您的 r 中有空字符串。
    Now r=""

    在第一次迭代中,您将获取第一个字符 (i=0) 并将 r 附加到它。
    r = "1" + "";
    Now r=1

    在第二次迭代中,您将获取第二个字符 (i=1) 并将 r 附加到它
    r = "2" + "1";
    Now r=21

    你可以像这样在纸上追踪执行,然后你就会很容易理解发生了什么。

    【讨论】:

      【解决方案4】:

      该方法所做的是将字符串s 中的每个字符放在新字符串r 的前面。重命名变量可能有助于说明这一点。

      public String reverse(String s){
          String alreadyReversed = "";
          for(int i=0; i<s.length(); i++){
              //perform the following until count i is as long as string s
              char thisCharacterInTheString = s.charAt(i); // for i==0 returns first 
                                                           // character in passed String
              alreadyReversed = thisCharacterInTheString + alreadyReversed;
          }
          return alreadyReversed;
      }
      

      所以在for 循环的第一次迭代中alreadyReversed 等于1 + 本身(一个空字符串)。

      在第二次迭代中,alreadyReversed 等于 2 + 自身 (1)。
      然后3 + 本身 (21)。
      然后4 + 321.
      然后5 + 4321

      【讨论】:

        【解决方案5】:

        回到你的问题陈述(取一个输入字符串并以相反的顺序产生一个输出字符串)。然后考虑如何做到这一点(而不是如何编写 Java 代码来做到这一点)。

        你可能会想出两种选择:

        1. 从输入字符串的后面开始,一次获取一个字符并形成一个新字符串(从而颠倒其顺序)。
        2. 从字符串的前面开始,获取一个字符。然后对于每个下一个角色,将其放在您迄今为止创建的所有角色的前面。

        您的伪代码结果可能如下所示

        选项 1
        让 l = 输入字符串的长度 将输出字符串设置为“” 当 l > 0 将输入字符串的“lth”字符添加到输出字符串 l 减 1

        选项 2留作提问者的练习。

        然后你会考虑如何编写 Java 来处理你的算法。你会发现有几种方法可以获取字符串的“lth”字符。首先,在 Java 中,长度为 l 的字符串在位置 0 到 l-1 中有字符。您可以使用string.charAt(loc)string.substring(loc,loc+1) 来获取位置loc 的字符

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-01
          • 2010-11-03
          • 2011-11-07
          • 1970-01-01
          • 2021-12-09
          相关资源
          最近更新 更多