在下面十进制算术问题中,十个不同字母的每一个代表着一个0-9中的数字,写出
一个程序发现所有的可能解决的方案:
MARK A=1 W=2 N=3 R=4 E=5 9147
+ ALLEN L=6 K=7 L=8 M=9 S=0 +16653
________ --------------
WEISS 25800
小弟才疏学浅,刚学java不久,那位大xia能帮我个忙啊!不甚感激
解决方案 »
- 请写出下面代码的输出结果
- 小问题:修改Integer
- hufman编码 java版本
- 多线程例题随运行次数结果改变!
- 用过jfreechart画直线图和折线图的高手请进(就剩10分了)
- 数据库连接问题, 请各位大侠能够指点:在线等待!谢谢
- 我的socket客户端为什么收不到返回包? 急啊
- 求救:java.sql.SQLException: [Oracle][ODBC][Ora]ORA-01722: 无效数字!
- java的生存空间有多大?
- jdk1.1.8下如何去连接数据库呢?
- 求解!有N个矩形区域,要把他拼成一张大的矩形,求拼出最小矩形的算法!
- 编译显示 Cannot find type 'Authenticator'
I=8?我把你条件改一下(一一对应):A=1 W=2 N=3 R=4 E=5
L=6 K=7 I=8 M=9 S=0程序如下:import java.util.HashMap;public class Test {
static char[] chars = { 'S', 'A', 'W', 'N', 'R', 'E', 'L', 'K', 'I', 'M' };
static HashMap hashMapC2D;
static HashMap hashMapD2C; public static void main(String[] strs) {
String str1 = "MARK"; String str2 = "ALLEN"; System.out.println(plus(str1, str2)); } public static String plus(String str1, String str2) {
return getStringFromLong(getLongFromString(str1)
+ getLongFromString(str2));
} public static long getLongFromString(String str) {
long value = 0;
for (int i = 0; i < str.length(); i++) {
value += ((Integer) (hashMapC2D.get(str.charAt(i)))).intValue();
if (i < str.length() - 1)
value *= 10;
}
return value;
} public static String getStringFromLong(long num) {
StringBuffer sb = new StringBuffer();
String str = Long.toString(num);
for (int i = 0; i < str.length(); i++) {
sb.append(hashMapD2C.get(str.charAt(i)));
} return sb.toString();
} static {
hashMapC2D = new HashMap();
hashMapD2C = new HashMap(); for (int i = 0; i < chars.length; i++) {
hashMapC2D.put(chars[i], i);
hashMapD2C.put(Character.forDigit(i, 10), chars[i]);
}
}}
题目是这样的
在下面十进制算术问题中,十个不同字母的每一个代表着一个0-9中的数字,写出
一个程序发现所有的可能解决的方案: 例如:
MARK A=1 W=2 N=3 R=4 E=5 9147
+ ALLEN L=6 K=7 I=8 M=9 S=0 +16653
---------- --------------
WEISS 25800
要求MARK+ALLEN=WEISS的话,结果如下:
start...
E=0, W=2, A=1, S=5, R=4, L=7, M=3, N=6, I=8, K=9
E=0, W=2, A=1, S=5, R=4, L=7, M=3, N=9, I=8, K=6
E=0, W=9, A=8, S=2, R=1, L=6, M=3, N=5, I=4, K=7
E=0, W=9, A=8, S=2, R=1, L=6, M=3, N=7, I=4, K=5
E=2, W=6, A=5, S=0, R=7, L=8, M=3, N=1, I=4, K=9
E=2, W=6, A=5, S=0, R=7, L=8, M=3, N=9, I=4, K=1
E=3, W=2, A=1, S=4, R=0, L=7, M=6, N=5, I=8, K=9
E=3, W=2, A=1, S=4, R=0, L=7, M=6, N=9, I=8, K=5
E=3, W=6, A=5, S=1, R=7, L=4, M=8, N=2, I=0, K=9
E=3, W=6, A=5, S=1, R=7, L=4, M=8, N=9, I=0, K=2
E=4, W=3, A=2, S=6, R=1, L=8, M=5, N=7, I=0, K=9
E=4, W=3, A=2, S=6, R=1, L=8, M=5, N=9, I=0, K=7
E=5, W=2, A=1, S=0, R=4, L=6, M=9, N=3, I=8, K=7
E=5, W=2, A=1, S=0, R=4, L=6, M=9, N=7, I=8, K=3
E=5, W=2, A=1, S=3, R=7, L=8, M=6, N=4, I=0, K=9
E=5, W=2, A=1, S=3, R=7, L=8, M=6, N=9, I=0, K=4
E=6, W=3, A=2, S=5, R=9, L=7, M=8, N=1, I=0, K=4
E=6, W=3, A=2, S=5, R=9, L=7, M=8, N=4, I=0, K=1
E=6, W=5, A=4, S=0, R=3, L=7, M=8, N=1, I=2, K=9
E=6, W=5, A=4, S=0, R=3, L=7, M=8, N=9, I=2, K=1
end.
程序:import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;public class Test { public static void main(String[] strs) {
String str1 = "MARK";
String str2 = "ALLEN";
String str3 = "WEISS"; printResult(str1, str2, str3); } public static void printResult(String str1, String str2, String str3) {
HashSet hashSetChar = new HashSet();
for (int i = 0; i < str1.length(); i++) {
hashSetChar.add(str1.charAt(i));
}
for (int i = 0; i < str2.length(); i++) {
hashSetChar.add(str2.charAt(i));
}
for (int i = 0; i < str3.length(); i++) {
hashSetChar.add(str3.charAt(i));
}
if (hashSetChar.size() > 10) {
System.out.println("counter of Character > 10, no result.");
} HashMap hashMapC2D = new HashMap();
HashSet hashSetDigit = new HashSet(); Object[] characters = hashSetChar.toArray();
int i = 0;
for (; i < characters.length; i++) {
hashMapC2D.put(characters[i], i);
hashSetDigit.add(i);
} System.out.println("start...");
while (i >= 0) {
if (i == characters.length) {
if (getLongFromString(str1, hashMapC2D)
+ getLongFromString(str2, hashMapC2D) == getLongFromString(
str3, hashMapC2D)) {
System.out.println(toStringHashMapC2D(hashMapC2D));
}
i--;
} int digit = -1;
Integer intDigit = (Integer) hashMapC2D.get(characters[i]);
if (intDigit != null) {
digit = intDigit.intValue();
hashMapC2D.remove(characters[i]);
hashSetDigit.remove(digit);
} if (digit == 9) {
i--;
} else {
while (digit++ < 9) {
if (!hashSetDigit.contains(digit)) {
break;
}
}
if (digit == 10)
i--;
else {
hashMapC2D.put(characters[i], digit);
hashSetDigit.add(digit);
i++;
}
}
}
System.out.println("end."); } private static String toStringHashMapC2D(HashMap hashMapC2D) {
StringBuffer sb = new StringBuffer();
Iterator iteratorKey = hashMapC2D.keySet().iterator();
while (iteratorKey.hasNext()) {
Character character = (Character) iteratorKey.next();
Integer digit = (Integer) hashMapC2D.get(character);
sb.append(character);
sb.append("=");
sb.append(digit);
sb.append(", ");
}
sb.delete(sb.length()-2, sb.length());
return sb.toString(); } public static long getLongFromString(String str, HashMap hashMapC2D) {
long value = 0;
for (int i = 0; i < str.length(); i++) {
value += ((Integer) (hashMapC2D.get(str.charAt(i)))).intValue();
if (i < str.length() - 1)
value *= 10;
}
return value;
}
}
题目没有任何难度,程序也没有任何技巧。
唯一的关键是System.out.println("start..."); 下面的while (i > = 0) {}循环--用一个循环和一个变量实现了回溯算法。
本来,排列的算法用递归的话,程序会更清晰(初学者更容易看懂),但是考虑到资源和性能问题,还是用循环做了。
当然,把回溯或者单函数递归的程序,改写成简单循环,本来也没有任何技巧可言,是程序员考试和
高级程序员考试的基本功。
注意: Test.java 使用了未经检查或不安全的操作。
注意: 要了解详细信息,请使用 -Xlint:unchecked 重新编译。还有,在我运行的时候,输出的格式和你给的不一样,同样的代码,为什么格式不一样呢?我的格式是这样的:start...
S=0, I=2, M=8, R=3, K=1, A=4, W=5, N=9, L=7, E=6
S=0, I=2, M=8, R=3, K=9, A=4, W=5, N=1, L=7, E=6
S=0, I=4, M=3, R=7, K=1, A=5, W=6, N=9, L=8, E=2
S=0, I=4, M=3, R=7, K=9, A=5, W=6, N=1, L=8, E=2
S=0, I=8, M=9, R=4, K=3, A=1, W=2, N=7, L=6, E=5
S=0, I=8, M=9, R=4, K=7, A=1, W=2, N=3, L=6, E=5
S=1, I=0, M=8, R=7, K=2, A=5, W=6, N=9, L=4, E=3
S=1, I=0, M=8, R=7, K=9, A=5, W=6, N=2, L=4, E=3
S=2, I=4, M=3, R=1, K=5, A=8, W=9, N=7, L=6, E=0
S=2, I=4, M=3, R=1, K=7, A=8, W=9, N=5, L=6, E=0
S=3, I=0, M=6, R=7, K=4, A=1, W=2, N=9, L=8, E=5
S=3, I=0, M=6, R=7, K=9, A=1, W=2, N=4, L=8, E=5
S=4, I=8, M=6, R=0, K=5, A=1, W=2, N=9, L=7, E=3
S=4, I=8, M=6, R=0, K=9, A=1, W=2, N=5, L=7, E=3
S=5, I=0, M=8, R=9, K=1, A=2, W=3, N=4, L=7, E=6
S=5, I=0, M=8, R=9, K=4, A=2, W=3, N=1, L=7, E=6
S=5, I=8, M=3, R=4, K=6, A=1, W=2, N=9, L=7, E=0
S=5, I=8, M=3, R=4, K=9, A=1, W=2, N=6, L=7, E=0
S=6, I=0, M=5, R=1, K=7, A=2, W=3, N=9, L=8, E=4
S=6, I=0, M=5, R=1, K=9, A=2, W=3, N=7, L=8, E=4
end.
应该是HashMap和HashSet时,我没有写类型。因为考虑到用jdk1.3, jdk1.4的人也可以编译过俺的程序。
第二个问题Hash本来就是不排序的,不同jvm下面run,结果就是可能不一样。