今天看Thing in java的第四章有个小练习是找出4位数的所有吸血鬼数字( 一个4位数字,可以拆分2个2位数数字的乘积,顺序不限。)自己写了个递归的实现,虽然是正确的,但感觉不满意,效率太低了。大二暑假时也是努力学了了3个多月的算法,什么动态规划,剪枝搜索,图论,ac自动机也是随手拿来,也是作为学校的一个队员拿到省程序设计大赛的三等奖。后来学javaee,android很少用到算法渐渐淡忘,到现在大三都快忘光了。网上搜了下,找到了吸血鬼数字的一个高效率的实现
import java.util.Arrays;
public class VampireNum {
public static void main(String[] arg) {
String[] ar_str1, ar_str2;
int sum = 0;
int from;
int to;
int i_val;
int count = 0;
// 对i和j的双重循环,用到剪枝
for (int i = 10; i < 100; i++) {
// j=i+1避免重复
from = Math.max(1000 / i, i + 1);
to = Math.min(10000 / i, 100);
for (int j = from; j < to; j++) {
i_val = i * j;
if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {
continue;
}
count++;
ar_str1 = String.valueOf(i_val).split("");
ar_str2 = (String.valueOf(i) + String.valueOf(j)).split("");
Arrays.sort(ar_str1);
Arrays.sort(ar_str2);
if (Arrays.equals(ar_str1, ar_str2)) {// 排序后比较,为真则找到一组
sum++;
System.out.println("第" + sum + "组: " + i + "*" + j + "=" + i_val);
}
}
}
System.out.println("共找到" + sum + "组吸血鬼数");
System.out.println(count);
}
}
因为有基础,看还是很容易看懂的,也再次感受到算法的魅力,加上最近看了篇一个大神学习算法之路(我的算法学习之路)和面试经历(9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路),又让我提起对算法的强烈兴趣。关于算法在开发有用与否的讨论也是看过不少。自己觉得因为在不同的领域不同的高度对算法的使用和态度肯定因人而异。
我是觉得算法还是挺相当有用的,很多小算法在项目也是经常用到,很多时候不是用不到算法,而是因为不知道所以采用一般的实现方法。而且很多面试也是关于算法,对于以后找工作面试也是很有帮助的,嘿嘿。也是决定在学习之余时常花时间重拾算法。
(最近刚开始写博客,语言组织和技术哪里不妥大家多给点意见,助我快速成长^_^)
来源:oschina
链接:https://my.oschina.net/u/1583592/blog/261843