簡體   English   中英

換信,我在做什么錯?

[英]letter change, what am I doing wrong?

因此,我嘗試以下挑戰:使用Java語言,讓函件LetterChanges(str)接受要傳遞的str參數,並使用以下算法對其進行修改。 用字母后面的字母替換字符串中的每個字母(即c變成d,z變成a)。 然后在此新字符串(a,e,i,o,u)中將每個元音大寫,最后返回此修改后的字符串。

這是我的代碼

class LetterChange {  
  public static String LetterChanges(String str) {
    String alphabet = "AbcdEfghIjklmnOpqrstUvwxyz";
    char currentChar,letter;
    int i = 0;
    while (i < str.length())
    {
      currentChar = str.charAt(i);
      for(int x = 0; x < alphabet.length(); x++)
      {
        letter = alphabet.charAt(x);
        if (currentChar == letter){
          str  = str.replace(currentChar,alphabet.charAt(x+1));
          i++;
        }
      }
    }

當我運行它時,它將返回字符串+1字母中的最后一個字符。 例如,如果我要運行“ bcd”,它將返回“ EEE”。 我不明白為什么它用最后一個字符的循環結果替換所有字符。

此解決方案有幫助嗎?

public static String letterChanges(String str) {
    String alphabet = "AbcdEfghIjklmnOpqrstUvwxyz";

    StringBuilder stringBuilder = new StringBuilder();

    for (char letter : str.toCharArray()) {
        if (alphabet.contains(Character.toString(letter))) {
            int index = alphabet.indexOf(letter) + 1;

            if (index >= 26) {
                index = 0;
            }

            stringBuilder.append(alphabet.charAt(index));
        }
    }

    return stringBuilder.toString();
}

以前的解決方案很難遵循,因此很難解釋為什么不調試就無法解決問題的原因。 使用for-each循環遍歷str參數並使用Java提供的方法(如.indexOf和.charAt)查找匹配項更加容易。

另外,Java使用小寫駝峰方法命名,用letterChanges代替LetterChanges :)

如果您有任何疑問,請告訴我。

當您第一次經歷循環時,

"bcd"--> "ccd"

現在, str.replace將在下一個回合中將其轉換為“ ddd”,然后將其轉換為“ EEE”。 即,替換替換每次出現時的每次出現。

的確,將來在IDE中對其進行調試將對您有所幫助! 另外,如果您的弦中有一個小寫的元音怎么辦?

 public class Alphabet {

          public static String LetterChanges(String str) {
            String alphabet = "AbcdEfghIjklmnOpqrstUvwxyz";


            char[] string = str.toLowerCase().toCharArray();
            for (int i=0; i < string.length; i++) {
                char d = alphabet.charAt(((alphabet.toLowerCase().indexOf(string[i]))+1) % 26);

                string[i]=d;
            }

            return new String(string);
          }    
    public static void main(String[] args) {
        System.out.println(Alphabet.LetterChanges("aabb"));


    }       
}

alphabet.charAt(

((alphabet.toLowerCase()。的indexOf(字符串[I]))

+1)%26)

1)在輸入和字符串映射上使用toLowerCase消除大小寫問題

2)在字符串映射“ alphabet”的index + 1處找到字符,並使用將z取為a的模數將其視為循環緩沖區。
索引25(z)+ 1 == 26-> 0(A),因為26是0 mod 26,而索引0(A)+ 1 = 1-> 1 mod26。只需要將z包裝到A同時不更改其他25個索引,並且比使用“ if”語句進行分支更有效。

之所以得到該結果,是因為每次替換都需要重新設置輸入字符串。 我推薦你:

  • 更好地嘗試使用兩個不同的變量:讓輸入變量保持不變,並處理輸出變量。
  • 因為字符串是不可修改的(正如您已經知道的那樣),所以最好將它們聲明為char數組。
  • 為了優化,可以將算法基於一個循環 ,該循環將遍歷輸入字符串的字符。 對於每個字符,請確定該字符是否為字母,以及是否應替換為哪個字符。

暫無
暫無

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

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