簡體   English   中英

我如何獲得 output 之類的 output 字符串?

[英]How I get the output like output string?

我試圖解決這個問題很多次。 但我不明白如何獲得數值尊重的 ASCII 字符。

按照以下步驟操作:

  1. 將 position 中的字符替換為其對應的 ASCII 值
  2. 使用 StringBuilder 反轉字符串。

輸入字符串:--->

?85O89*69R65*87O104*33I104

Output應該是這樣的:--->

?uoy*era*woH*!iH

我如何在 java 中獲得 output?

與其他人不同,我認為這實際上是一個有趣的問題,新手可能會覺得難以理解。

給定字符串

?85O89*69R65*87O104*33I104

我們看到有重復的模式,一個字符+一個數值。 那時我們有

?85
O89
*69
R65
*87
O104
*33
I104  

基於提議的 output 我們理解數字代表一個ASCII 碼點
我們還看到每個字符的大小寫都顛倒了。

因此,我們可以編寫以下代碼。

final String value = "?85O89*69R65*87O104*33I104";
final StringBuilder sb = new StringBuilder();

// We split the string based on the \w(\d+) pattern, "reversed"
final String[] parts = value.split("(?=([^\\d]+))");

for (final String s : parts) {
   // For each character we must reverse its case
   // The first symbol is already in a presentable form
   final char c = s.charAt(0);
   sb.append(Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c));

   // The remaining part represents an ASCII symbol in decimal form
   final int codePoint = Integer.parseInt(s.substring(1));
   final String str = new String(Character.toChars(codePoint));
   sb.append(Character.isUpperCase(codePoint) ? str.toLowerCase() : str.toUpperCase());
}

System.out.println(sb);

哪個會正確打印

?uoy*era*woH*!iH

輸入字符串似乎使用*作為“單詞”分隔符,應保留在 output 中。

一個“單詞”包含 3 個字符,第一個和最后一個字符在編碼字符串中顯示為 ASCII 碼。

解碼一個單詞時,字母字符的大小寫必須反轉:lower -> upper,upper -> lower。

話雖如此,以下實現可能如下:

static Pattern WORD = Pattern.compile("(\\d+)(.)(\\d+)");

public static String decode(String str) {
    return Arrays
        .stream(str.split("((?<=[*!\\?])|(?=[*!\\?]))"))
        .map(s -> s.matches(WORD.pattern()) ? decodeWord(s) : s)
        .collect(Collectors.joining());
}

private static String decodeWord(String word) {
    Matcher match = WORD.matcher(word);
    if (match.find()) {
        return new StringBuilder()
            .append(decodeChar((char)(Integer.parseInt(match.group(1)))))
            .append(decodeChar(match.group(2).charAt(0)))
            .append(decodeChar((char)(Integer.parseInt(match.group(3)))))
            .toString();
    }
    return ""; 
}

static char decodeChar(char c) {
    if (Character.isLetter(c)) {
        return Character.isUpperCase(c) ? Character.toLowerCase(c) : Character.toUpperCase(c);
    }
    return c;
}

測試:

System.out.println(decode("?85O89*69R65*87O104*33I104"));

Output:

?uoy*era*woH*!iH

根據您所說的,並根據您給出的字符串,我假設每個 position 都介於(不包括結尾)兩個非數字之間。

    public static String perform(String str) {
        StringBuilder sb = new StringBuilder("");
        
        String dump = "";//dump string
        for(int i = 0;i<str.length();i++) {//Read the string char by char
            int ascii = (int) str.charAt(i);//work with ASCII
            
            if(ascii - '0' < 0 || ascii - '0' > 9) {//check if ascii is a non-number
                
                if(dump.length() != 0) {//can dump
                    int c = Integer.parseInt(dump);
                    
                    if(c >= 65 && c <= 90) {//uppercase to lowercase
                        sb.append((char) (c - 'A' + 'a'));
                    }
                    
                    if(c >= 97 && c <= 122) {//lowercase to uppercase
                        sb.append((char) (c - 'a' + 'A'));
                    }
                    dump = "";//clear
                }
                
                if(ascii < 65 || (ascii > 90 && ascii < 97) || ascii > 122) {//not a letter
                    sb.append(str.charAt(i));
                }else {//is a letter
                    if(ascii >= 65 && ascii <= 90) {//uppercase to lowercase
                        sb.append((char) (ascii - 'A' + 'a'));
                    }
                    
                    if(ascii >= 97 && ascii <= 122) {//lowercase to uppercase
                        sb.append((char) (ascii - 'a' + 'A'));
                    }
                }
                
            }else {// Is number
                dump += str.charAt(i);
            }
        }
        
        if(dump.length() != 0) {
            int c = Integer.parseInt(dump);
            
            if(c >= 65 && c <= 90) {//uppercase to lowercase
                sb.append((char) (c - 'A' + 'a'));
            }
            
            if(c >= 97 && c <= 122) {//lowercase to uppercase
                sb.append((char) (c - 'a' + 'A'));
            }
        }
        
        return sb.toString();
    }

暫無
暫無

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

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