以下是问题陈述:
给定一个字符串,通过在接下来的两个字符之后移动第一个字符来计算一个新字符串,因此“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
}
在if语句中有third +=3
但是当我把它放在if语句之外时,我没有得到所需的输出。我真的不明白为什么?
答案 0 :(得分:2)
希望这会有所帮助:
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;
}
答案 1 :(得分:0)
因为将它放在循环之外会导致third
过于频繁地增加。在第一次迭代i is 0, third is 5
之后,下一次迭代产生i=1, third=8; i=2, third=11; i=3, third=14
等等 - &gt; i
永远不会达到第三位。
我会通过删除整个if语句来改进你的代码,将third
全部删除,只需在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));
}
如果我没有误解你的代码,那么如果它们不是三个字符组的一部分,那么你就缺少留下最后一个字符的逻辑。
答案 2 :(得分:0)
如果您面对这样的效果,请拿一张纸并在代码的每一行后写下变量的值。
if
块创建一个替代执行路径,如果条件为真,则在每个第三次循环迭代中。
if
块后面的任何内容都在每次循环迭代中执行。
因此,当有问题的行位于if
块内(在右大括号之前)时,变量third
中的值仅在每第三次循环迭代时更改。
当您移动右括号后面的行时,赋值位于if
块之外,因此执行每次循环迭代。
答案 3 :(得分:0)
对于comment = //使用此行,但为什么??????
&#34;第三&#34;的价值变量在for循环中变化,只有i等于第三个字符,否则第三个值将继续增加,例如。
当i = 0时,第三= 2 当i = 1时,第三= 5 当i = 2时,第三个= 8
所以if语句永远不会被触发,因此它不起作用。希望这是有道理的。
PS - 我强烈建议使用IDE调试器来正确理解这一点 PS - 为了性能原因,使用charAt方法比较子串方法
更好答案 4 :(得分:0)
public String oneTwo(String str) {
String temp = "";
String result = "";
int i = 0;
while (str.substring(i).length() >= 3) {
temp = str.substring(i, i + 3);
result += temp.substring(1) + temp.charAt(0);
i += 3;
}
return result;
}
答案 5 :(得分:0)
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;
}
答案 6 :(得分:0)
public String oneTwo(String str) {
if(str.length()<3)return "";
return str.substring(1,3)+str.substring(0,1)+oneTwo(str.substring(3));
}
这作为递归问题很简单
答案 7 :(得分:0)
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;
}
答案 8 :(得分:0)
另一种解决方案...
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;
}