5 回答

TA貢獻1797條經驗 獲得超6個贊
IDK,為什么所有其他解決方案都錯過了一個必要條件(第一個字符必須是小寫,0%2 == 0)。您的測試代碼仍然會失敗。
正確的解決方案是,
public static String alternatingCaps(String s) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (i % 2 == 0) {
result.append(Character.toLowerCase(s.charAt(i)));
} else {
result.append(Character.toUpperCase(s.charAt(i)));
}
}
return result.toString();
}
PS:交換方法調用toUpperCase和toLowerCase其他答案以獲得正確的解決方案。

TA貢獻1816條經驗 獲得超6個贊
Java 中的字符串是不可變的,因此您無法修改它。所有修改字符串的方法都會在內部創建一個新字符串并返回它。
我認為最好的解決方案是使用StringBuilder:
public static String alternatingCaps(String str) {
StringBuilder buf = new StringBuilder(str.length());
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
buf.append(i % 2 == 0 ? Character.toLowerCase(ch) : Character.toUpperCase(ch));
}
return buf.toString();
}

TA貢獻1864條經驗 獲得超2個贊
您可以使用數組。
public class Main
{
public static void main(String[] args) {
String s = alternatingCaps("toronto");
System.out.print(s);
}
public static String alternatingCaps(String s) {
char [] array = new char[s.length()];
for (int i = 0; i < s.length(); i++) {
if (i % 2 == 0) {
array[i]=Character.toUpperCase(s.charAt(i));
} else {
array[i]=Character.toLowerCase(s.charAt(i));
}
}
return String.valueOf(array);
}
}

TA貢獻1815條經驗 獲得超6個贊
正如其他人所說,您實際上并沒有更改返回的值,而只是打印修改后的值。
我采取了另一種方法來演示另一種在不使用模的情況下更改每個其他值的方法:
public static String alternatingCaps(String s) {
boolean toggle = true;
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (toggle = !toggle) {
sb.append(Character.toUpperCase(c));
}
else {
sb.append(Character.toLowerCase(c));
}
}
return sb.toString();
}
這使用StringBuilder來構建返回String,并使用String.toCharArray()增強for循環來迭代所有字符而不是索引。
我們能夠for在這里使用增強循環,因為我們改變了確定索引是奇數還是偶數的方式。我們不使用模數,而是使用在每次傳遞之間切換的值,從而有效地執行相同的操作boolean。truefalse
請注意,此方法總體上不如模方法,因為如果您想要每第三個值等,則可以輕松修改模,并且比此方法更容易閱讀。這個例子主要是為了學習其他解決問題的方法。
我還避免了三元運算符,因此更容易看到切換是如何boolean工作的,盡管可以通過使用它來進一步簡化。

TA貢獻1828條經驗 獲得超3個贊
您不會返回已處理的String,您只是將其打印在 StdOut 上,因此輸入String不會更改并且您的 jUnit 會失敗。
這里使用 a StringBuilder,追加處理后的字符,最后String通過調用toString()上的方法返回StringBuilder。
public static String alternatingCaps(String s) {
StringBuilder temp = new StringBuilder();
IntStream.range(0, s.length()).forEach(idx ->{
if (idx % 2 == 0) {
temp.append(Character.toUpperCase(s.charAt(idx)));
}else {
temp.append(Character.toLowerCase(s.charAt(idx)));
}
});
return temp.toString();
}
另一種使用Collectors#joiningandIntStream迭代輸入索引的方式String應用邏輯并使用以下方式收集它Collectors#joining:
public static String alternatingCaps(String s) {
return IntStream.range(0, s.length())
.mapToObj(idx -> String.valueOf(idx % 2 == 0
? Character.toUpperCase(s.charAt(idx))
: Character.toLowerCase(s.charAt(idx))))
.collect(Collectors.joining(""));
}
添加回答
舉報