簡體   English   中英

JAVA - 沒有臨時字符串的反向字符串,數組,字符串構建器,子字符串

[英]JAVA - Reverse String without temp String, array, Stringbuilder, substring

我有一個問題問你。 因此,我必須使用此要求反轉String:

  1. 僅使用:1個變量字符串(用於輸入),1個變量字符串和1個變量int
  2. 無法使用其他字符串,字符串構建器,列表,數組或集合
  3. 輸入結果中指定的輸出結果
  4. 輸入變量的長度不能增加
  5. 不能使用函數substring

然后我試試這個,這是正確的嗎?

  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

世界olleH

orldW olleH

rldoW olleH

ldroW olleH

dlroW olleH

dlroW olleH

之后:dlroW olleH

您可以使用遞歸來執行任務,如下所示:

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);
}

String是java中的不可變類,任何似乎修改它的方法總是會返回一個帶有修改的新字符串對象。 所以答案是,不,你不能在Java中就地反轉String。 Java String是作為char數組的包裝器實現的,它對您是隱藏的(即您只能通過常規方式獲取此數組的副本)。

僅使用:1個變量字符串(用於輸入),1個變量字符串和1個變量int

這意味着,期望的解決方案是:

  • 從String中的位置n獲取字符,存儲到字符變量。
  • 將變量m移動到n (以字符串形式)。
  • 將緩存的char從字符變量恢復到位置m
  • 重復,直到完全處理字符串。

這是“基本”編程語言的典型問題。 但是Java不允許這樣做,因為它泄漏了根據字符串中的位置設置字符的選項。

雖然這在其他語言中毫無疑問 ,但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 -loop而將其降低到一個額外的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;
}

不使用任何集合,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

希望能幫助到你 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM