我正在尝试实现一个简单的问题,那就是2013年">http://argote.mx/?p=353">上的facebook黑客大会。
节选:给出了一个字符串,小约翰尼将字符串的美定义为字符串中字母的美丽之和。每个字母的美是介于1到26之间的整数,包括在内,没有两个字母具有相同的美。约翰尼不在乎字母是大写还是小写,所以这不会影响信的美。你是一个学生,在写一篇关于这位著名黑客的年轻人的报告。你发现了约翰尼认为最漂亮的绳子。这个字符串最大的美是什么?
我已经实现了我自己的解决方案,基于将单个字母映射到特定的数字。
下面是代码:
package samplecodes;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;
public class StringBeauty {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> input= new ArrayList<String>();
try{
FileReader f1 = new FileReader(args[0]);
BufferedReader f = new BufferedReader(f1);
String newLine;
while ((newLine=f.readLine()) != null){
StringTokenizer st = new StringTokenizer(newLine);
while (st.hasMoreTokens()) {
String string= st.nextToken();
input.add(string);
}
for(String i: input)
System.out.println("input "+i);
///printLower(input);
calculateStringBeauty(input);
input.clear();
}
}
catch(Exception e){
e.printStackTrace();
}
}
public static void calculateStringBeauty(ArrayList<String> input){
/** mapping based on analysing input string**/
HashMap<Character,Integer> map= new HashMap<Character,Integer>();
map.put( Character.valueOf('a'),24);
map.put( Character.valueOf('b'),25);
map.put( Character.valueOf('c'),26);
map.put( Character.valueOf('d'),1);
map.put( Character.valueOf('e'),2);
map.put( Character.valueOf('f'),3);
map.put( Character.valueOf('g'),4);
map.put( Character.valueOf('h'),5);
map.put( Character.valueOf('i'),6);
map.put( Character.valueOf('j'),7);
map.put( Character.valueOf('k'),8);
map.put( Character.valueOf('l'),9);
map.put( Character.valueOf('m'),10);
map.put( Character.valueOf('n'),11);
map.put( Character.valueOf('o'),12);
map.put( Character.valueOf('p'),13);
map.put( Character.valueOf('q'),14);
map.put( Character.valueOf('r'),15);
map.put( Character.valueOf('s'),16);
map.put( Character.valueOf('t'),17);
map.put( Character.valueOf('u'),18);
map.put( Character.valueOf('v'),19);
map.put( Character.valueOf('w'),20);
map.put( Character.valueOf('x'),21);
map.put( Character.valueOf('y'),22);
map.put( Character.valueOf('z'),23);
int sum=0;
for(String i: input){
i=i.toLowerCase();
// System.out.println("i "+i);
char[] array= i.toCharArray();
for(char a: array){
if(map.containsKey(a))
sum+=map.get(a);
else
continue;
}
}
System.out.print(sum);
System.out.println();
}
}我的解决方案似乎完全适用于其中一个测试用例。ABbCcc -> 152,这正确地映射了So I just go consult Professor Dalves -> 392 (根据我的代码)。但预计将根据所提供的测试用例返回一个美丽的646值。
任何帮助调试我的代码或建议,以改进我的算法将不胜感激。
发布于 2013-04-21 09:17:23
首先,谢谢你搅乱了我的思想:
现在,正如我所理解的那样,一个角色出现得越多,它就越美丽。
因此,考虑到这一点,您需要找到其他方法来计算单个字符出现的次数。我正在考虑尝试一些花哨的正则表达式,但我的正则表达式技能相当差:P
相反,我选择创建一个简单的对象,将字符映射到事件中。实际上,您并不需要这个字符,但我使用它进行调试。你可以用Map<Character, Integer>来代替.
您也可以轻松地使用由26个元素组成的int[]数组。每个元素表示一个字符(即a == 0和z == 25)
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Hack {
public static void main(String[] args) {
new Hack();
}
public Hack() {
System.out.println("152 = " + getBeauty("ABbCcc"));
System.out.println("754 = " + getBeauty("Good luck in the Facebook Hacker Cup this year!"));
System.out.println("491 = " + getBeauty("Ignore punctuation, please :)"));
System.out.println("729 = " + getBeauty("Sometimes test cases are hard to make up."));
System.out.println("646 = " + getBeauty("So I just go consult Professor Dalves\t"));
}
protected int getBeauty(String value) {
int sum = 0;
value = value.toLowerCase();
char[] values = value.toCharArray();
Map<Character, Beauty> mapBeauty = new HashMap<>(26);
for (char c : values) {
if (Character.isLetter(c)) {
Beauty beauty = mapBeauty.get(c);
if (beauty == null) {
beauty = new Beauty(c);
mapBeauty.put(c, beauty);
}
beauty.add();
}
}
List<Beauty> beauties = new ArrayList<>(mapBeauty.values());
Collections.sort(beauties);
int weight = 26;
for (Beauty beauty : beauties) {
int bweight = weight * beauty.getOccurance();
// System.out.println(beauty.getValue() + " @ " + beauty.getOccurance() + " x " + weight + " = " + bweight);
sum += bweight;
weight--;
}
return sum;
}
public class Beauty implements Comparable<Beauty> {
private char value;
private int occurance;
public Beauty(char value) {
this.value = value;
occurance = 0;
}
public char getValue() {
return value;
}
public void add() {
occurance++;
}
public int getOccurance() {
return occurance;
}
@Override
public int compareTo(Beauty o) {
return o.getOccurance() - getOccurance();
}
}
}输出..。
152 = 152
754 = 754
491 = 491
729 = 729
646 = 646发布于 2013-04-21 09:16:45
举个例子,我不确定这个哈希表。实际上没有任何理由存储键和值,因为它们在字符串之间不一致。
除此之外,您应该尝试的是确定哪个字符在字符串中显示得最多,与其大小写或相对字母位置无关。一旦找到出现最多的一个,就将它分配到26次,乘以它出现的次数,并将值存储在累加器中。继续到下一个出现第二大字符的字符,以此类推。
ABbCcc -> c= 26,b= 25,a= 24
->->做数学= 152
所以我去咨询Dalves教授,s=26,o=25,u,t,r,e,l=24-20,剩下的得到19-10。
->->做数学= 646
希望这能帮点忙!
https://stackoverflow.com/questions/16129028
复制相似问题