JAVA - 没有临时字符串的反向字符串,数组,字符串构建器,子字符串

时间:2015-03-14 14:56:20

标签: java string char substring reverse

我有一个问题要问你。 因此,我必须使用此要求反转字符串:

  1. 仅使用:1个变量字符串(用于输入),1个变量字符串& 1变量int
  2. 无法使用其他字符串,字符串构建器,列表,数组或集合
  3. 输入变量
  4. 中指定的输出结果
  5. 输入变量的长度不能增加
  6. 不能使用函数substring
  7. 然后我试试这个,这是正确的吗?

      String str = "Hello World";  
    
      System.out.println("Before : "+str);
    
      for(int i=0;i<str.length();i++){
    
       str = new String(str.getBytes(), 1, str.length()-1-i) + new String(str.getBytes(), 0, 1) + new String(str.getBytes(), str.length()-i, i);
    
       System.out.println(str);
    
      }
    
      System.out.println("After : "+str);
    

    输出:

    之前:Hello World

    ello WorldH

    llo WorldeH

    lo WorldleH

    o WorldlleH

    WorldolleH

    World olleH

    orldW olleH

    rldoW olleH

    ldroW olleH

    dlroW olleH

    dlroW olleH

    之后:dlroW olleH

4 个答案:

答案 0 :(得分:2)

您可以使用递归来完成任务,如下所示:

public static String reverse(String source, int from) {
    if (source.length()-from == 1) {
        return source.charAt(from)+"";
    }
    return reverse(source, from+1) + source.charAt(from);
}

答案 1 :(得分:1)

String是java中的不可变类,任何似乎修改它的方法总是会返回一个带有修改的新字符串对象。 所以答案是,不,你不能在Java中就地反转String。 Java String是作为char数组的包装器实现的,它对你是隐藏的(即你只能通过常规手段获得这个数组的副本)。

答案 2 :(得分:0)

  

仅使用:1个变量字符串(用于输入),1个变量char&amp; 1变量int

这意味着,所需的解决方案是:

  • 从字符串n中取出字符,存储到字符变量。
  • 将变量m移至n(字符串中)。
  • 将缓存的char从字符变量恢复到位置m
  • 重复,直到字符串完全处理完毕。

这是“基本”编程语言的典型问题。但是Java不允许这样做,因为它泄漏了根据字符串中的位置设置字符的选项。

虽然这是其他语言中的 no brainer ,但java没有选项可以根据字符串索引设置值。

public static String reverse(String str){
        char c;
        int i = 0;

        for (i=0; i< str.length() / 2; i++){
            c = str.charAt(i);

            //this would be required to match your requirements.
            str[i] = str.charAt(str.length() -1 -i);    
            str[str.length() -1 -i] = c;            
        }

        return str;
    }

但是在java中,你只能这样做:

public static String reverse(String str){
    char c;
    int i = 0;

    for (i=0; i< str.length() / 2; i++){
        c = str.charAt(i);
        char[] temp = str.toCharArray();
        temp[i] = str.charAt(str.length() -1-i);
        temp[str.length() -1 -i] = c;
        str = new String(temp);
    }

    return str;
}

创建了额外的char数组和新的String对象...即使您可以通过将其声明为for - 循环来将其降低到一个额外的char数组,它也可以不再符合要求。

我认为设计这个问题的人正在思考“C”或“php”,其中可以对字符串进行基于索引的访问。

如果一个String等于一个char数组(它在一些较旧的语言中,它可能是这个练习的起源),它将如下所示:

public static char[] reverse(char[] str){
    char c;
    int i = 0;

    for (i=0; i< str.length / 2; i++){
        c = str[i];
        str[i] = str[str.length -1-i];
        str[str.length -1 -i] = c;
    }

    return str;
}

答案 3 :(得分:0)

不使用任何集合,StringBulider,StringBuffer或temp数组反转字符串。简单明快:

public static void main(String[] args) {

    String test = "Hello World";
    String rev = "";
    Pattern p = Pattern.compile("[\\w|\\W]");
    Matcher m = p.matcher(test);
    while (m.find()) {
        rev = m.group()+rev;
    }
    System.out.println("Reverse==" + rev);
}

输出

  

反向== dlroW olleH

希望有所帮助:)