【问题标题】:Reverse string of integers while not reversing the integers themselves反转整数字符串,而不反转整数本身
【发布时间】:2013-04-15 09:22:45
【问题描述】:

我正在尝试使函数反转一串整数,但我只能使用我找到的以下代码完全镜像它。 (我想将它从字符串转换为不带数组或列表的字符串,最好是递归)

static String reverseMe(String s) {
if(s.length() == 0)
  return "";
return s.charAt(s.length() - 1) + reverseMe(s.substring(0,s.length()-1));

}

例如,当我真正想要 (41 2 1) 时, (1 2 41) 返回 (14 2 1)。我希望 Java 在遇到空格(或任何非整数)时开始反转并保持整数本身不变。

【问题讨论】:

  • 一定要用递归吗?
  • 不,我只是认为这会是一个更好的解决方案。我们只是在课堂上介绍过它。
  • 对空间进行标记,然后反转结果数组。

标签: java string recursion integer reverse


【解决方案1】:

另一个使用Tail call recursion的递归变体。

public static String reverseMe(String s) {
    StringBuilder sb = new StringBuilder();
    return reverseMe(s.split(" "), sb);
}

public static String reverseMe(String[] s, StringBuilder sb) {
    if (s.length == 0) {
        return sb.toString().trim();
    } else {
        return reverseMe(Arrays.copyOfRange(s, 1, s.length), sb.insert(0, " ").insert(0, s[0]));
    }
}

【讨论】:

    【解决方案2】:

    可以这么简单。

    String num="1 2 41";
        StringTokenizer sTok=new StringTokenizer(num, " ");
        String revnum="";
        while(sTok.hasMoreTokens())
        {
            revnum=sTok.nextToken()+" "+revnum;
        }
        System.out.println(revnum);
    

    【讨论】:

      【解决方案3】:

      如果你对递归不特别感兴趣,下面的解决方案会起作用。

      static String reversMe(String str) {
      
          StringBuffer strBuf = new StringBuffer();
      
          String strArray = str.split(" ");
      
      
          for(int i = strArray.length();i>=0; i--) {
      
             strBuf.append(strArray[i]).append(" ");  
      
           }
      
           return strBuf.toString().trim();     
          }
      

      【讨论】:

        【解决方案4】:

        如果你想递归地做,这会做!

        public static String reverseIt(final String inp,final int lastIndex,String out)
        {
            int i=lastIndex;
            while(inp.charAt(i)!=' ' && i!=-1){i--;if(i==-1)break;}
            out+=(inp.substring(i+1,lastIndex+1));if(i!=-1)out+=" ";
            if(lastIndex!=0)return reverseIt(inp,i-1,out);
            else return out;
        }
        

        您现在可以将其称为

        reverseIt(input,input.length-1,output);
        

        【讨论】:

          【解决方案5】:

          非递归,存在番石榴。

            String input = "123 456 789 tt 012";
            Iterable<String> tokens = Splitter.on(Pattern.compile("[^\\d]")).omitEmptyStrings().split(input);
            for(String token: tokens){
                 StringBuilder builder = new StringBuilder(token);
                 System.out.println(builder.reverse().toString());
            }
          

          或者没有番石榴:

          String input = "123 456 789 tt 012";
              String tokens [] = input.split("[^\\d]+");
              for(String token:tokens){
                  StringBuilder builder = new StringBuilder(token);
                  System.out.println(builder.reverse().toString());
              }
          

          【讨论】:

            【解决方案6】:

            其中的另一种解决方案

            static String reverseMe(String s) {
                    if(s.length() == 0)
                      return "";
                    String sa[] = s.split(" ");
                    List<String> newlist = Arrays.asList(sa);
                    Collections.reverse(newlist);
                    return newlist.toString();
            
            }
            

            【讨论】:

              【解决方案7】:

              使用 String#lastIndexOf 的函数的修改版本:

              String reverseMe(String s)
              {
                if (s.length() == 0)
                   return "";
                int index = s.lastIndexOf(" ");
                if (index == -1) // not found, thus just return the string
                   return s;
                else // found, thus concat last part with recursive call
                   return s.substring(index + 1) + " " + reverseMe(s.substring(0, index));
              }
              

              或者您可以使用String#split 以空格分隔,然后反向循环并连接。

              String reverse(String s)
              {
                String reversed = "";
                String[] split = s.split(" ");
                reversed = split[split.length-1];
                for (int i = split.length-2; i >= 0; i--)
                {
                  reversed += " " + split[i];
                }
                return reversed;
              }
              

              虽然StringBuilder 会是一个更有效的选择,因为它不需要复制所有字符串。

              【讨论】:

              • 这很好,但我不允许使用列表或数组。还是谢谢。
              • @user2307428 查看编辑 - 我适当地修改了您的功能。
              • 嘿,第二个解决方案正是我想要的!非常感谢!
              【解决方案8】:

              你也可以使用 StringTokenized

                  StringTokenizer st = new StringTokenizer("1 2 41");
                  StringBuilder sb = new StringBuilder();
                  while (st.hasMoreTokens()) {
                      if (sb.length() > 0) {
                          sb.insert(0, ' ');
                      }
                      sb.insert(0, st.nextToken());
                  }
                  System.out.println(sb.toString());
              

              【讨论】:

                猜你喜欢
                • 2015-04-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-14
                相关资源
                最近更新 更多