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(""));
}
添加回答
举报