Java 如何应对编码蝙蝠字符串-2一二挑战?

Java 如何应对编码蝙蝠字符串-2一二挑战?,java,Java,以下是问题陈述: 给定一个字符串,通过将第一个字符移动到下两个字符之后来计算一个新字符串,因此“abc”产生“bca”。对随后的每组3个字符重复此过程,使“abcdef”产生“bcaefd”。忽略末尾少于3个字符的任何组 这是我的密码: // oneTwo("abc") → "bca" // oneTwo("tca") → "cat" // oneTwo("tcagdo") → "catdog" public String oneTwo(String str) { String x

以下是问题陈述:

给定一个字符串,通过将第一个字符移动到下两个字符之后来计算一个新字符串,因此“abc”产生“bca”。对随后的每组3个字符重复此过程,使“abcdef”产生“bcaefd”。忽略末尾少于3个字符的任何组

这是我的密码:

// oneTwo("abc") → "bca"
// oneTwo("tca") → "cat"
// oneTwo("tcagdo") → "catdog"  

public String oneTwo(String str) {
    String x = "";
    if (str.length() < 3) {
        return "";
        // return empty
    } else if (str.length() == 3) {
        String s = str.substring(1, str.length());
        x = s + str.substring(0, 1);      // last two + first char
    } else if (str.length() > 3) {
        int third = 2;
        // start with the third element index of 2
        for (int i = 0; i < str.length(); i++) {
            if (i == third) {
                // given three chars substring first char
                // substring last two chars and add that to x
                x += (str.substring(third - 1, third + 1) +
                        str.substring(third - 2, third - 2 + 1));
                third += 3;
                //work  with this line but why??????
            }
            //third +=3;
            // doesn't work with this line but why???????


        }// end of for loop
    }
    return x;
    // return modified string x
}
//oneTwo(“abc”)→ “bca”
//oneTwo(“tca”)→ “猫”
//oneTwo(“tcagdo”)→ “猫狗”
公共字符串oneTwo(字符串str){
字符串x=“”;
如果(str.length()<3){
返回“”;
//返回空
}else if(str.length()==3){
字符串s=str.substring(1,str.length());
x=s+str.substring(0,1);//最后两个+第一个字符
}else if(str.length()>3){
int第三=2;
//从第三个元素索引2开始
对于(int i=0;i

third+=3
在if语句内部工作时,但是当我把它放在if语句外部时,我没有得到所需的输出。我真的不明白为什么

因为将其放在循环之外会导致第三个
的次数过多增加。在第一次迭代后,
i为0,第三次为5,下一次迭代产生
i=1,第三次为8;i=2,第三方=11;i=3,third=14等->
i
永远不会到达第三位

我将通过删除整个if语句来改进代码,同时删除
第三个
,并在
for
-循环中简单地增加3:

for( int i = 2; i < str.length(); i+=3){
    x += (str.substring(third-1, third+1) + 
          str.substring(third-2, third-2 + 1));
}
for(int i=2;i

如果我没有误解您的代码,那么您就缺少了保留最后一个字符的逻辑,如果它们不是三个字符组的一部分。

如果您面临这种影响,请拿出一张纸,在代码的每一行后面写下变量的值


如果条件为真,则
if
块会创建一个替代执行路径,该路径在每三次循环迭代中都会出现

在每次循环迭代中执行
if
块后面的任何内容

因此,当所讨论的行位于
if
块内(在右大括号之前)时,变量
third
中的值仅每三次循环迭代更改一次


当您将行移到右括号后面时,赋值在
if
块之外,因此每次循环迭代都会执行。

注释=//使用此行,但为什么

只有当i等于第三个字符时,“第三个”变量的值才会在for循环中更改,否则第三个变量的值将继续增加

当i=0时,第三方=2
当i=1时,第三个=5
当i=2时,第三个=8

因此if语句永远不会被触发,因此它不起作用。希望这是有意义的

PS-我强烈建议使用IDE调试器来正确理解这一点。
PS-由于性能原因,与子字符串方法相比,使用charAt方法更好

希望这有助于:

public String oneTwo(String str) {
    String str2 = "";
    for(int i=0; i<str.length()-2; i+=3) {
        str2 = str2+str.substring(i+1,i+3)+str.charAt(i);
    }
    return str2;
}
公共字符串oneTwo(字符串str){
字符串str2=“”;
对于(int i=0;i
publicsstringonetwo(stringstr){
字符串str1=“”;
如果(str.length()=3){
对于(int i=0;i
publicsstringonetwo(stringstr){
if(str.length()
publicstringonetwo(stringstr){
字符串newThreeChars=“”;

如果(str.length()要查看的另一个解决方案

public String oneTwo(String str) {
  int i = 0;
  String result = "";
  Character tmpChar = '\0';
  
  while(i <= str.length()-3){
    tmpChar = str.charAt(i);
    result = result + str.charAt(i+1) + str.charAt(i+2) + tmpChar;
    tmpChar = '\0';
    i = i + 3;
  }
  
  return result;
}
公共字符串oneTwo(字符串str){
int i=0;
字符串结果=”;
字符tmpChar='\0';

while(我已经分析了您的问题。我建议您使用输入字符串,而不是遍历字符。这将使您能够始终只查看前三个字符。这样,您正在进行的所有索引数学(从现在起三周内将无法轻松理解:-)),将消失。虽然此代码片段可能会解决此问题,但它不会解释为什么或如何回答此问题。请注意,这确实有助于提高您文章的质量。请记住,您将为将来的读者回答此问题,而这些人可能不知道您代码建议的原因。请添加说明使用您的答案,并解释它与其他答案的不同之处。欢迎使用堆栈溢出。在回答旧问题之前,使用其他答案确保您的答案添加了新的内容或与之相关的其他有用内容。此外,虽然此代码片段可能会解决此问题,但它不会解释为什么或如何回答此问题。请e,因为这有助于提高你的文章的质量。请阅读以了解堆栈溢出的工作原理并查看。请编辑你的答案并添加一些解释,谢谢。
public String oneTwo(String str) {

 String str1 = "";
 if(str.length()<3){
  return str1; 
 }else if(str.length()>=3){
    for(int i =0; i<str.length()-2; i=i+3){
            str1 = str1 + str.substring(i+1,i+3)+ str.substring(i,i+1);

        }
 }

 return str1;
}
public String oneTwo(String str) {
  if(str.length()<3)return "";
  return str.substring(1,3)+str.substring(0,1)+oneTwo(str.substring(3));
}
public String oneTwo(String str) {
        String newThreeChars = "";
        if(str.length()<3){
            return newThreeChars;
        }
        for(int i=0; i<str.length()/3; i+=3){
            String threeChars = str.substring(i,i+3);
            String redesigned = threeChars.substring(1) + threeChars.charAt(0);
            newThreeChars +=redesigned;
        }
        return newThreeChars;

    }
public String oneTwo(String str) {
  int i = 0;
  String result = "";
  Character tmpChar = '\0';
  
  while(i <= str.length()-3){
    tmpChar = str.charAt(i);
    result = result + str.charAt(i+1) + str.charAt(i+2) + tmpChar;
    tmpChar = '\0';
    i = i + 3;
  }
  
  return result;
}