WWWDOT-GOOGLE=DOTCOM,
最終結果:
777589-188103=589486
777589-188106=589483
package com.wang.chars;
import java.util.Map;
import com.google.common.collect.Maps;
import lombok.Data;
public class SecretSum {
@Data
static class CharObj {
private Character character;
private boolean used;
private int value;
}
public static void main(String[] args) {
String[] parameters = { "wwwdot", "google", "dotcom" };
// 對於每一個字符使用每一個數據
Map<Character, CharObj> charObjs = Maps.newHashMap();
// 進行字符初始化
init(parameters, charObjs);
// 對於每一個字符應用每一個數字
Character[] characters = {};
characters = charObjs.keySet().toArray(characters);
applyNumber(charObjs, characters, 0, parameters);
}
private static void applyNumber(Map<Character, CharObj> charObjs, Character[] characters, int index, String[] parameters) {
if (index == characters.length) {
applyCalculation(charObjs, parameters);
return;
}
CharObj charObj = charObjs.get(characters[index]);
for (int i = 0; i < 10; i++) {
if (isValidNumber(i, charObjs, characters, index)) {
charObj.setValue(i);
charObj.setUsed(true);
applyNumber(charObjs, characters, index + 1, parameters);
}
}
}
private static void applyCalculation(Map<Character, CharObj> charObjs, String[] parameters) {
Integer number[] = { 0, 0, 0 };
number[0] = getNumber(charObjs, parameters[0]);
number[1] = getNumber(charObjs, parameters[1]);
number[2] = getNumber(charObjs, parameters[2]);
if (number[0] - number[1] == number[2]) {
System.out.println(number[0] + "-" + number[1] + "=" + number[2]);
}
}
private static Integer getNumber(Map<Character, CharObj> charObjs, String string) {
char[] characters = string.toCharArray();
Integer number = 0;
for (int i = 0; i < characters.length; i++) {
number = number * 10 + charObjs.get(characters[i]).getValue();
}
return number;
}
// 不能使用前面已經使用過的字符
private static boolean isValidNumber(int i, Map<Character, CharObj> charObjs, Character[] characters, int index) {
for (int j = 0; j < index; j++) {
CharObj charObj = charObjs.get(characters[j]);
if (charObj.getValue() == i) {
return false;
}
}
return true;
}
private static void init(String[] parameters, Map<Character, CharObj> charObjs) {
for (String parameter : parameters) {
for (Character character : parameter.toCharArray()) {
if (!charObjs.containsKey(character)) {
CharObj charObj = new CharObj();
charObj.setCharacter(character);
charObj.setUsed(false);
charObj.setValue(-1);
charObjs.put(character, charObj);
}
}
}
}
}