任务是检查一个句子的每个单词中的数字,找到同时具有最大数字的单词POWER OF 3.我在这里做了所有事情并且它工作正常,直到我在句子中的最后一个单词以数字结尾
例如:
输入:Iam8 you64 asjkj125 asdjkj333 heis216:OutOfBounds
输入:Iam8 you64 asjkj125 asdjkj333 heis216s:heis216s是目标词
然后它会走出界限,我已经(至少我认为我)发现了哪里,但我不知道如何避免这种情况而不改变这个计算的想法。
以下是发生这种情况的代码:
for (int i = 0; i < r.length(); i++) {
current+= r.charAt(i);
if (r.charAt(i) == ' ' || i = r.length()-1) {
for (int j = 0; j < current.length(); j++) {
while ((int) current.charAt(j) > 47 && (int) current.charAt(j) < 58) {
//如果最后一个单词的最后一个字符是一个数字,j递增,我们最终超出界限。
br = br + current.charAt(j);
j++;
}
即使在最后一个字符串处理后,current
仍在处理中,因此会发生StringIndexOutOfBoundsException
异常。因为正在处理current
字符串,所以j
的检查应该是current
的长度。像j < current.length()
一样在while
循环中添加while ( j<current.length() && (int) current.charAt(j) > 47 && (int) current.charAt(j) < 58)
的检查。
使用split方法获取此句子的标记。
对于每个令牌,从ascci数字的索引开始,直到令牌的长度,将存储在映射中的数字作为值和字符部分作为键。
然后处理map的值以获得3的幂,然后得到它的键值并相应地返回单词。
while(j <current.length()&&(int)current.charAt(j)> 47 &&(int)current.charAt(j)<58){br + = current.charAt(j); J ++; }
我只更改了这个,并且不再看到OutOfRange异常了。如果我理解你的任务正确,代码看起来很复杂,你使用String进行计算,这是无效的。看看这种方法:
public static void main(String[] args) {
String v = "Iam8 you64 asjkj125 asdjkj333 heis216s";
int sum = 0, max = 0, start = 0;
StringBuilder maxWord = new StringBuilder();
for (int i = 0; i < v.length(); ++i) {
char ch = v.charAt(i);
if (Character.isWhitespace(ch)) {
max = updateMax(v, maxWord, max, sum, start, i);
start = i + 1;
sum = 0;
} else if (Character.isDigit(ch)) {
sum += ch - 48;
}
}
if (sum > 0) {
updateMax(v, maxWord, max, sum, start, v.length());
}
System.out.println(maxWord.toString());
}
private static int updateMax(String v, StringBuilder maxWord, int max, int sum, int start, int i) {
if (sum >= max && isPowerOfThree(sum)) {
maxWord.replace(0, maxWord.length(), v.substring(start, i));
return sum;
}
return max;
}
private static boolean isPowerOfThree(int sum) {
// see any from https://stackoverflow.com/questions/1804311/how-to-check-if-an-integer-is-a-power-of-3
while (sum % 3 == 0) {
sum /= 3;
}
return sum == 1;
}
此外,如果您需要最后一个适当的单词,那么从输入字符串的结尾开始会更有效。