吸血鬼数字

前提

  最近公司没有什么事情可做,同事顺便再研究数据结构和算法这块的知识。临近下班的时候给我发一道算法题。计算出4位数中所有的吸血鬼数字。题目如下:
  algorithm xixuegui
  
  分析题目:
  - 位数为偶数,2位
  - 4位数中包含两个2位数的乘数(可以是无序的)
  - 两个0结尾的数字是不允许的
  
  结论:
    两个2位数相乘得到一个4位数,并且两个2位数的字符无序组合可以得到这个4位数。以两个0结尾的数是不允许的。   

实现思路

  
  - 1.四位数的字符拆分、两两组合相乘,得到的乘积等于这个四位数既是吸血鬼数字
  - 2.两个两位数相乘,得到一个四位数。两个两位数的字符串进行相加排序。四位数也进行排序,如果排序后的两个字符串相等,既是吸血鬼数字。   

两数组合

   大致实现:

for(int i=1000;i<=9999;i++){
String count = String.valueOf(i);
for(int a = 0;a<count.length();a++){
for(int b=0;b<count.length()&&b!=a;b++){

String num1 = String.format("%s%s", count.charAt(a),count.charAt(b)) ;
String num2 = count.replaceFirst(String.valueOf(count.charAt(a)), "")
.replaceFirst(String.valueOf(count.charAt(b)), "");
int intNum1 = Integer.valueOf(num1);
int intNum2 = Integer.valueOf(num2);

if( intNum1 > 10 && intNum2 > 10
&& intNum1 * intNum2 == Integer.valueOf(count)){
System.out.println(String.format("%s*%s=%s", num1,num2,count));
}
}

}
}

   结果展示:

21*60=1260
93*15=1395
41*35=1435
51*30=1530
21*87=1827
81*27=2187
86*80=6880
86*80=6880

排序比较

   大致实现:

for(int i=10;i<100;i++){
for(int j=10;j<100;j++){
int count = i * j;
if(count > 1000 && count < 9999 ){
if(isContainIAndJ(count,i,j)){
System.out.println(i+"*"+j+"="+count);
}
}
}
}

//判断count是否包含i,j.
private static boolean isContainIAndJ(int count, int i, int j) {

char[] charArray = toChars(String.valueOf(count));
char[] charArray2 =toChars(String.format("%s%s", i,j));
Arrays.sort(charArray); //排序
Arrays.sort(charArray2); //排序

if(String.valueOf(charArray).equals(String.valueOf(charArray2))){
return true;
}
return false;

}

//String转char[]
private static char[] toChars(String valueOf) {
char[] chars = new char[valueOf.length()];
for(int i =0;i<valueOf.length();i++){
chars[i] = valueOf.charAt(i);
}
return chars;
}

   结果展示:

15*93=1395
21*60=1260
21*87=1827
27*81=2187
30*51=1530
35*41=1435
41*35=1435
51*30=1530
60*21=1260
80*86=6880
81*27=2187
86*80=6880
87*21=1827
93*15=1395

后续遐想

  实现上是按照题目的需求来做的、不够灵活。在某些设计上都写死了,比如位数是4位(1000~9999),判断条件值都写死了。假如题目说求6位数中的吸血鬼数据,代码结构或者条件变量都会做出一定的改造,没有可扩展性。写代码不能为了一时之需,而不考虑后续扩展性,可复用性等。谨记!!!!

坚持原创技术分享,您的支持将鼓励我继续创作!
0%