0

我正在尝试解决这个问题 https://www.hackerrank.com/challenges/pangrams 这是我的代码

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Pangram {

public static String alltrim(String s)
{   String s1="";
    int i,j,k=0;
    for(i=0;i<s.length();i++)
    {
        char ch=s.charAt(i);
        if(ch!=' ')
        break;
    }
    for(j=s.length()-1;j>=0;j--)
    {
        char ch=s.charAt(j);
        if(ch!=' ')
        break;
    }
    for(k=i;k<j+1;k++) 
     s1 = s1 + s.charAt(k);

 return s1;
}
public static void main(String[] args)
{
    Scanner reader = new Scanner(System.in);
    String input = reader.nextLine();String s,s1;
    s = input.toLowerCase();
    s1 = alltrim(s);
    if( check(s1) )
        System.out.println("pangram");
    else
        System.out.println("not pangram");
}
public static boolean check(String input)
{
    int [] count = new int[26];
    for( int i = 0; i < input.length(); i++ )
    {
        char ch = input.charAt(i);
        count[ch-'a']++;
    }

    for( int cnt:count )
    {
        if( cnt ==0 )
            return false;
    }
    return true;
 }
}

我总是收到这个错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -65
      at Pangram.check(Pangram.java:46)
      at Pangram.main(Pangram.java:35)

我试图找出问题出在哪里,但我无法......谁能帮助我?

4

3 回答 3

1

这是一种方法

    public static void main(final String[] args) throws IOException {
         Scanner reader = new Scanner(System.in);
         String line = reader.nextLine();
            // Verify input argument length.

            final char[] allCharacters = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                    'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };

            
                    final TreeSet<Character> charactersPresent = new TreeSet<Character>();

                    // Parse the line into letters.
                    final char[] letters = line.toLowerCase().toCharArray();

                    // Keep a set of those that are present.
                    for (final char letter : letters) {
                            charactersPresent.add(letter);
                    }

                    // Print the letters present in the alphabet but not in the input.
                    final StringBuilder missingLettersBuilder = new StringBuilder();
                    for (final char character : allCharacters) {
                            if (!charactersPresent.contains(character)) {
                                    missingLettersBuilder.append(character);
                            }
                    }

                    if (missingLettersBuilder.length() == 0) {
                            System.out.println("This is  a PANGRAM");
                    } else {
                            System.out.println("Not a PANGRAM because it doesn't have "+missingLettersBuilder.toString());
                    }
            }
于 2015-03-21T16:40:35.243 回答
1

发生这种java.lang.ArrayIndexOutOfBoundsException: -65情况是因为您减去了 ASCII 表 (32-97=-65) 中a(97)表示的空格字符。32

这意味着问题出在您的allTrim方法中,它没有像您预期的那样替换所有空格。

如果要替换字符串的所有空格,可以使用replaceAll String 的方法。

丢弃该s1 = alltrim(s);行并将其替换为s1 = s.replaceAll(" ", "");

现在输入你在评论中给我的输入

aaabbb abc mnop xyyx xaxbbbxx

不会给任何例外。

至于您遇到的另一个异常(超出范围-43),这仅仅是因为您输入了

6 aaabbb abc mnop xyyx xaxbbbxx

6在ASCII表中用54表示,54-97 = 43。看看你给我们的链接的要求,你应该只比较字母所以我想这是一个错误。

请注意,您可以轻松删除字符串的所有数字,您的替换行将变为:

s1 = s.replaceAll(" ", "").replaceAll("\\d", "");

现在即使输入也不会给出任何错误

6 aaabbb abc mnop xyyx xaxbbbxx

于 2015-03-21T16:49:50.533 回答
1

问题出在

count[ch-'a']++;

其中 ch 是6(如您输入的那样)并且您正在减去'6'-'1'因此它通过减去 ASCII 值来生成一个值并给出

count[-43]++;
于 2015-03-21T16:45:29.950 回答