簡體   English   中英

反轉單詞而不改變大寫或標點符號

[英]Reverse words without changing capitals or punctuation

創建一個字符最少的程序,以反轉字符串中的每個單詞,同時保持單詞的順序,以及標點符號和大寫字母,在它們的初始位置。

通過“單詞的順序”,我的意思是每個單詞都被一個空格(“”)分隔,因此縮寫等將被視為一個單詞。 宮縮中的撇號應該留在同一個地方。 (“不要”=>“不”)。

(標點符號表示任何不是 az、AZ 或空格的字符*)。

Numbers were removed from this list due to the fact that you cannot have capital numbers. Numbers are now treated as punctuation.

例如,對於輸入:

你好,我是一條魚。

它應該是 output:

Olleh,我是一個 hsif。

請注意,O 是第一個單詞中的第一個字母,現在是大寫字母,因為 H 之前在同一位置是大寫字母。

逗號和句號也在同一個地方。

更多示例:

這個; 是一些文字!

將 output

希特; Si Emos Txet!

我試過這個:

 public static String reverseWord(String input)
    {
         
        String words[]=input.split(" ");
         StringBuilder result=new StringBuilder();
       
          for (String string : words) {
              String revStr = new StringBuilder(string).reverse().toString();
              result.append(revStr).append(" ");
          }
        return result.toString().trim();
        
    } 

我已嘗試解決您的問題。 對於我檢查過的示例,它工作正常:)請查看並告訴我:)

public static void main(String[] args) {

    System.out.println(reverseWord("This; Is Some Text!"));
}

public static boolean isAlphaNumeric(String s) {
    return s != null && s.matches("^[a-zA-Z0-9]*$");
}

public static String reverseWord(String input)
{

    String words[]=input.split(" ");
    StringBuilder result=new StringBuilder();
    int startIndex = 0;
    int endIndex = 0;
    for(int i = 0 ; i < input.length(); i++) {
        if (isAlphaNumeric(Character.toString(input.charAt(i)))) {
            endIndex++;
        } else {
            String string = input.substring(startIndex, endIndex);
            startIndex = ++endIndex;

            StringBuilder revStr = new StringBuilder("");
            for (int j = 0; j < string.length(); j++) {
                char charToAdd = string.charAt(string.length() - j - 1);
                if (Character.isUpperCase(string.charAt(j))) {
                    revStr.append(Character.toUpperCase(charToAdd));
                } else {
                    revStr.append(Character.toLowerCase(charToAdd));
                }
            }
            result.append(revStr);
            result.append(input.charAt(i));
        }
    }
      if(endIndex>startIndex) // endIndex != startIndex
        {
            String string = input.substring(startIndex, endIndex);
            result.append(string);
        }
    return result.toString().trim();

}

使用您的測試字符串調用 reverseWord。 希望能幫助到你。 如果是,請不要忘記將其標記為正確答案:)

這是一個符合您要求的建議。 它可能看起來很長,但它只是注釋和充氣代碼; 每個人都喜歡評論。

public static String smartReverseWords(String input) {
    StringBuilder finalString = new StringBuilder();
    // Word accumulator, resetted after each "punctuation" (or anything different than a letter)
    StringBuilder wordAcc = new StringBuilder(); 
    int processedChars = 0;
    
    for(char c : input.toCharArray()) {
        // If not a whitespace nor the last character
        if(!Character.isWhitespace(c)) {  
            // Accumulate letters 
            wordAcc.append(c);   
            
            // Have I reached the last character? Then finalize now:
            if(processedChars == input.length()-1) {
                reverseWordAndAppend(wordAcc, finalString);
            }
        }        
        else {
            // Was a word accumulated?
            if(wordAcc.length() > 0) {
                reverseWordAndAppend(wordAcc, finalString);
            }
            // Append non-letter char to final string:
            finalString.append(c);
        }
        processedChars++;
    }
    return finalString.toString();
}

private static void reverseWordAndAppend(StringBuilder wordAcc, StringBuilder finalString) {
    // Then reverse it:
    smartReverse(wordAcc);  // a simple wordAcc.reverse() is not possible

    // Append word to final string:
    finalString.append(wordAcc.toString());
    
    // Reset accumulator 
    wordAcc.setLength(0);        
}

private static class Marker {
    Integer position;
    String character;
}

private static void smartReverse(StringBuilder wordAcc) {
    char[] arr = wordAcc.toString().toCharArray();
    wordAcc.setLength(0);  // clean it for now
    
    // Memorize positions of 'punctuation' + build array free of 'punctuation' in the same time:
    List<Marker> mappedPosOfNonLetters = new ArrayList<>();     // order matters
    List<Integer> mappedPosOfCapitals = new ArrayList<>();      // order matters
    
    for (int i = 0; i < arr.length; i++) {
        char c = arr[i];
        if(!Character.isLetter(c)) {
            Marker mark = new Marker();
            mark.position = i;
            mark.character = c+"";
            mappedPosOfNonLetters.add(mark);
        }
        else {
            if(Character.isUpperCase(c)) {
                mappedPosOfCapitals.add(i);
            }
            wordAcc.append(Character.toLowerCase(c));
        }
    }
    
    // Reverse cleansed word:
    wordAcc.reverse();

    // Reintroduce 'punctuation' at right place(s)
    for (Marker mark : mappedPosOfNonLetters) {
        wordAcc.insert(mark.position, mark.character);
    }
    // Restore capitals at right place(s)
    for (Integer idx : mappedPosOfCapitals) {
        wordAcc.setCharAt(idx,Character.toUpperCase(wordAcc.charAt(idx)));
    }    
}

編輯

我已經更新了代碼以考慮您的所有要求。 事實上,我們必須確保“標點符號”保持在原位(以及大寫字母),但也要保持在一個單詞之內,例如縮略語。

因此給定以下輸入字符串:

"Hello, I am on StackOverflow. Don't tell anyone."

代碼產生這個 output:

"Olleh, I ma no WolfrEvokcats. Tno'd llet enoyna."

暫無
暫無

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

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