0 .Thanks
题目来自于大神:给聪明的你解解闷
1 .这是一道世界级的难题
世界级难题.png再次声明一下,
- 这个是4位数的密码,
- 五次输入都错,
- 但是只有两个数字正确,而且数字的位置都不对。
2 .学渣的解法
学渣没学啥高深算法,一上来,直接就暴力法。
- 首先,我们先来两个工具方法:(因为要对密码的每一位进行分析,所以要先把每一个位给分割出来)
/**
* 输入一个整数,分割其每一个位数
* @param num
* @return 返回一个数组,0-N代表1-N-1位
*/
public static int[] cutInt(int num) {
int size = countSize(num);
int[] result = new int[size];
for (int i = 0; i < size; i++) {
result[i] = num % 10;
num = num / 10;
}
return result;
}
/**
* 输入一个整数,判断其位数。
* @return
*/
public static int countSize(int num) {
int i;
for (i = 1;; i++) {
num = num/10;
if (num==0)
break;
}
return i;
}
- 然后,写一下检验条件:
思路是,对分割出来的检验数字,跟匹配的密码进行条件的检验。
也就是上面的几个条件: - 这个是4位数的密码,
- 五次输入都错,
- 但是只有两个数字正确,而且数字的位置都不对。
在方法内部,先进行相同的数字的位置确定,
然后,进行检验是否是只有两个数字相同且位置不一样。
/**
* 检验规则
* @param check 要检验的数字
* @param temp 参考
* @return
*/
private static boolean check(int[] check, int[] temp) {
int[] checkLocal = new int[check.length];
int[] tempLocal = new int[check.length];
int index = 0;
for (int i = 0; i < check.length; i++) {
for (int j = 0; j < temp.length; j++) {
if (temp[i] == check[j]) {
checkLocal[index] = j;
tempLocal[index] = i;
index++;
}
}
}
if (index==2) {
for (int i = 0; i < index; i++) {
if (checkLocal[i]==tempLocal[i]) {
return false;
}
}
return true;
}
return false;
}
- 好了,最后附上源码
public class Test {
public static void main(String[] args) {
long time = System.currentTimeMillis();
int[] a = cutInt(6087);
int[] b = cutInt(5173);
int[] c = cutInt(1358);
int[] d = cutInt(3825);
int[] e = cutInt(2531);
List<Integer> result = new ArrayList<>();
for (int i = 1000; i <= 9999; i++) {
int[] check = cutInt(i);
if ( check(check,a) &&
check(check,b) &&
check(check,c) &&
check(check,d) &&
check(check,e)) {
result.add(i);
}
}
time = System.currentTimeMillis() - time;
for (int i = 0; i < result.size(); i++) {
System.out.println("第"+(i+1)+"个结果:"+result.get(i));
}
System.out.println("Time(ms):"+time);
}
/**
* 检验规则
* @param check 要检验的数字
* @param temp 参考
* @return
*/
private static boolean check(int[] check, int[] temp) {
int[] checkLocal = new int[check.length];
int[] tempLocal = new int[check.length];
int index = 0;
for (int i = 0; i < check.length; i++) {
for (int j = 0; j < temp.length; j++) {
if (temp[i] == check[j]) {
checkLocal[index] = j;
tempLocal[index] = i;
index++;
}
}
}
if (index==2) {
for (int i = 0; i < index; i++) {
if (checkLocal[i]==tempLocal[i]) {
return false;
}
}
return true;
}
return false;
}
/**
* 输入一个整数,分割其每一个位数
* @param num
* @return 返回一个数组,0-N代表1-N-1位
*/
public static int[] cutInt(int num) {
int size = countSize(num);
int[] result = new int[size];
for (int i = 0; i < size; i++) {
result[i] = num % 10;
num = num / 10;
}
return result;
}
/**
* 输入一个整数,判断其位数。
* @return
*/
public static int countSize(int num) {
int i;
for (i = 1;; i++) {
num = num/10;
if (num==0)
break;
}
return i;
}
}
答案:
第1个结果:8712
Time(ms):3
3 .大神的解法
以上是学渣我的直接解法,没有多一刻的考虑。
关于各位大神,请评论,回复您的解法吧~
网友评论