使用 names.txt(右键单击并“将链接/目标另存为...”),一个包含 5000 多个名字的 46K 文本文件,首先将其按字母顺序排序。然后计算出每个名称的字母值,将此值乘以其在列表中的字母位置以获得名称分数。
例如,当列表按字母顺序排序时,COLIN 的值为 3 + 15 + 12 + 9 + 14 = 53,是列表中的第 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);
}
最佳答案
您的正则表达式存在某种缺陷。逗号数显示有 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 个名字。
关于java - Java 中的 Project Euler #22(关闭 7 364 934),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11463435/