1

5,000 を超える名前を含む 46K のテキスト ファイルである names.txt (右クリックして [リンク先を保存/対象を指定して保存]) を使用して、最初にアルファベット順に並べ替えます。次に、各名前のアルファベット値を計算し、この値にリスト内のアルファベット順の位置を掛けて名前スコアを取得します。

たとえば、リストをアルファベット順に並べ替えると、3 + 15 + 12 + 9 + 14 = 53 に相当する COLIN は、リストの 938 番目の名前です。したがって、COLIN は 938 53 = 49714 のスコアを取得します。

ファイル内のすべての名前スコアの合計は?

863833348 が表示されますが、正解は 871198282 です。何が問題なのかわかりません。すべてのことを試しましたが、問題を特定できませんでした。

コード:

public static void main(String args[]) throws IOException {

    String alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    Pattern testRegEx=Pattern.compile("[^\\\"]\\w+[^\\\",]");

    String line;
    String filePath="//Users//painkillerfff//Documents//names.txt";
    BufferedReader readTextFile=new BufferedReader(new FileReader(filePath));

    List<String> nameList=new ArrayList<String>();
    while((line=readTextFile.readLine())!=null){
        //System.out.println(line);
        Matcher matcher=testRegEx.matcher(line);
        while(matcher.find()){
            nameList.add(matcher.group());
            //System.out.println(matcher.group());
        }
    }
    Collections.sort(nameList);

    long sumOfWords=0;
    long namePoint=0;
    long nameRank=1;
    for(String name: nameList){
        namePoint=0;
        for(int i=0;i<name.length();i++){
            namePoint+=alphabet.indexOf(name.charAt(i))+1;
        }
        namePoint=namePoint*nameRank;
        sumOfWords+=namePoint;
        nameRank++;
    }
    System.out.println("The Total Points is: "+sumOfWords);
}
4

2 に答える 2

3

あなたの正規表現には何らかの欠陥があります。カンマの数は 5163 の名前があることを示していますが、投稿すると 5130 になります。

正規表現を理解するのを手伝ってください。おそらく理解できるでしょう。

これは私のバージョンです - 正規表現は必要ありません。

    while ((line = readTextFile.readLine()) != null) {
        sb.append(line);
    }
    line = sb.toString();
    line = line.replace("\"", "");
    String[] a = line.split(",");
    System.out.println(a.length);

もちろん、実際の変数名を使用する必要があります。a;-)

編集 - あなたの正規表現をに変更しました

    Pattern testRegEx = Pattern.compile("\\w+");

5163 個の名前が返されました。

于 2012-07-13T03:40:24.130 に答える