如何向右移动字符?限制之后,我不知道。有人可以写评论吗?

时间:2019-10-14 05:48:47

标签: java

您可以使用Java API中的以下方法:

类字符串: 长度,charAt

StringBuilder类: 长度,charAt,追加,toString

类字符:任何方法

moveAllXsRight将一个char和一个String作为输入并返回一个String。 输出字符串应与输入字符串相同,只是每次出现的输入字符都应向右移一个字符。如果无法向右移动字符(它在字符串的末尾),则不会移动。不要使用数组来解决此问题。

  

HW2.moveAllXsRight('X',“ abcXdeXXXfghXiXXjXX”)   “ abcdXefXXXghiXjXXXX”

这是我的代码:

public static String moveAllXsRight(char a, String b){
     StringBuilder sb = new StringBuilder(); 
     String str ="";
     for ( int i = 0; i<b.length(); i++){
          if(b.charAt(i) != a){
              sb.append(b.charAt(i));
          }

         else if(b.charAt(i) == a){

              str = Character.toString(b.charAt(i));                 
         }

         else {
              if(b.charAt(i+2)>sb.length()){
                sb.append(b.charAt(i));
              }

              }
     }

     return sb.toString();
 }

3 个答案:

答案 0 :(得分:0)

尝试一下:

public static String moveAllXsRight(char a, String b) {
    StringBuilder sb = new StringBuilder(b);

    for(int i = 0; i < sb.length() - 1; i++) {
        if(sb.charAt(i) == a) {
            // swapping with the right character
            sb.setCharAt(i, sb.charAt(i + 1));
            sb.setCharAt(i + 1, a);
            // skipping next index (because we already know it contains `a`)
            i = i + 1;
        }
    }

    return sb.toString();
}

对于此示例:

moveAllXsRight('X', "abcXdeXXXfghXiXXjXX");

这是输出:

abcdXeXXfXghiXXXjXX

更新:

通过稍微改变for循环(将其反转):

for(int i = sb.length() - 2; i > 0; i--) { // inverse loop
    if(sb.charAt(i) == a) {
        // swapping
        sb.setCharAt(i, sb.charAt(i + 1));
        sb.setCharAt(i + 1, a);
    }
}

现在,这个:

moveAllXsRight('X', "abcXdeXXXfghXiXXjXX");

结果:

abcdXefXXXghiXjXXXX
  

现在,您可以决定要使用哪个版本。

答案 1 :(得分:0)

这里是一种方法:

public static String moveAllXsRight(char a, String b) {
    char[] chars = b.toCharArray();
    for (int i = 0; i < chars.length-1; ++i) {
        if (chars[i] == a) {
            chars[i] = chars[i+1];
            chars[i+1] = a;
        }
    }
    return new String(chars);
}

当参数分别为"abcdeXXXfghXiXXjXXX"'X'时,它会给出"abcXdeXXXfghXiXXjXX"

这是另一种方式:

public static String moveAllXsRight(char a, String b) {
    char[] chars = b.toCharArray();
    boolean wasa = false;
    for (int i = 0; i < chars.length; ++i) {
        char c = chars[i];
        if (wasa) {
            chars[i-1] = c;
            chars[i] = a;
        }
        wasa = c == a;
    }
    return new String(chars);
}

它给出"abcdXeXXfXghiXXjXXX"

更新

这是另一种方式:

public static String moveAllXsRight(char a, String b) {
    char[] chars = b.toCharArray();
    for (int i = chars.length-1; --i >= 0;) {
        char c = chars[i];
        if (c == a) {
            chars[i] = chars[i+1];
            chars[i+1] = a;
        }
    }
    return new String(chars);
}

它会提供"abcdXefXXXghiXjXXXX",这正是您所期望的。

更新2:

使用StringBuilder避免使用数组:

public static String moveAllXsRight(char a, String b) {
    StringBuilder buf = new StringBuilder(b);
    for (int i = buf.length()-1; --i >= 0;) {
        char c = buf.charAt(i);
        if (c == a) {
            buf.setCharAt(i, buf.charAt(i+1));
            buf.setCharAt(i+1, a);
        }
    }
    return buf.toString();
}

答案 2 :(得分:-2)

public static String moveAllXsRight(char a, String b){
    String str ="";
    int n = 0;
    char lower_a = Character.toLowerCase(a);
    char upper_a = Character.toUpperCase(a);

    for ( int i = b.length()-2; i>=0; i--){
        if(b.charAt(i) == lower_a || b.charAt(i) == upper_a){
            n++;
        }
    }

    str = b.substring(b.length()-n) + b.substring(0,b.length()-n);
    return str;
}