枚举思想
2015-08-19 09:32
585 查看
今天分享一下枚举思想,这种思想也常是码畜,码奴常用的手段,经常遭到码农以上级别的鄙视,枚举思想可以说是在被逼无奈时最后的狂吼。
一: 思想
有时我们解决某个问题时找不到一点规律,此时我们很迷茫,很痛苦,很蛋疼,突然我们灵光一现,发现候选答案的问题规模在百万之内,
此时我们就想到了从候选答案中逐一比较,一直找到正确解为止。
二: 条件
前面也说了,枚举是我们在无奈之后的最后一击,那么使用枚举时我们应该尽量遵守下面的两个条件。
① 地球人都不能给我找出此问题的潜在规律。
② 候选答案的集合是一个计算机必须能够承受的。
三:举例
下面是一个填写数字的模板,其中每个字都代表数字中的”0~9“,那么要求我们输入的数字能够满足此模板。
思路:首先拿到这个题,蛋还是比较疼的,因为找不到好的解题思路,仔细想想这属于查找类型的问题,常用的查找也就5种,能适合
该问题的查找也就”顺序查找“和”二分查找“,然后仔细看看问题规模最多也就105=100000,其实根据“二分"的思想在这个问题
中并不合适,最后只能用“顺序查找“了。
上代码:
[java] view
plaincopyprint?
package com.bankht.suanfa.meiju;
import org.junit.Test;
/**
* @author zhuyong
* @创建时间:2012-6-14 下午02:57:07
*
* @类说明 :枚举算法思想测试程序
*/
public class Meiju {
private String father = null;
private String mother = null;
private String son = null;
@Test
public void testMeiju() {
int[] a = { 111111, 222222, 333333, 444444, 555555, 666666, 777777, 888888, 999999 };
int[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
father = a[i] / b[j] + "";
mother = b[j] + "";
son = a[i] + "";
if ((father.charAt(0) == mother.charAt(0)) && (father.charAt(4) == son.charAt(0)) && (father.length() == 5)) {
System.out.println(" " + father);
System.out.println("X " + mother);
System.out.println("-------");
System.out.println(son);
System.out.println();
System.out.println("费了:" + ((i + 1 - 1) * 9 + (j + 1)) + "次,TMD终于找出来了!");
}
}
}
}
}
运行结果:
[html] view
plaincopyprint?
79365
X 7
-------
555555
费了:43次,TMD终于找出来了!
____________________________________________________________________________________________________________________
最后我们还是解决了问题,发现其中的时间复杂度达到了O(n2),这个复杂度理论上还是能接受的,还好我们的n在10以内,
n的每一次的自增对cpu来说都是莫大的伤害。
一: 思想
有时我们解决某个问题时找不到一点规律,此时我们很迷茫,很痛苦,很蛋疼,突然我们灵光一现,发现候选答案的问题规模在百万之内,
此时我们就想到了从候选答案中逐一比较,一直找到正确解为止。
二: 条件
前面也说了,枚举是我们在无奈之后的最后一击,那么使用枚举时我们应该尽量遵守下面的两个条件。
① 地球人都不能给我找出此问题的潜在规律。
② 候选答案的集合是一个计算机必须能够承受的。
三:举例
下面是一个填写数字的模板,其中每个字都代表数字中的”0~9“,那么要求我们输入的数字能够满足此模板。
思路:首先拿到这个题,蛋还是比较疼的,因为找不到好的解题思路,仔细想想这属于查找类型的问题,常用的查找也就5种,能适合
该问题的查找也就”顺序查找“和”二分查找“,然后仔细看看问题规模最多也就105=100000,其实根据“二分"的思想在这个问题
中并不合适,最后只能用“顺序查找“了。
上代码:
[java] view
plaincopyprint?
package com.bankht.suanfa.meiju;
import org.junit.Test;
/**
* @author zhuyong
* @创建时间:2012-6-14 下午02:57:07
*
* @类说明 :枚举算法思想测试程序
*/
public class Meiju {
private String father = null;
private String mother = null;
private String son = null;
@Test
public void testMeiju() {
int[] a = { 111111, 222222, 333333, 444444, 555555, 666666, 777777, 888888, 999999 };
int[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
father = a[i] / b[j] + "";
mother = b[j] + "";
son = a[i] + "";
if ((father.charAt(0) == mother.charAt(0)) && (father.charAt(4) == son.charAt(0)) && (father.length() == 5)) {
System.out.println(" " + father);
System.out.println("X " + mother);
System.out.println("-------");
System.out.println(son);
System.out.println();
System.out.println("费了:" + ((i + 1 - 1) * 9 + (j + 1)) + "次,TMD终于找出来了!");
}
}
}
}
}
运行结果:
[html] view
plaincopyprint?
79365
X 7
-------
555555
费了:43次,TMD终于找出来了!
____________________________________________________________________________________________________________________
最后我们还是解决了问题,发现其中的时间复杂度达到了O(n2),这个复杂度理论上还是能接受的,还好我们的n在10以内,
n的每一次的自增对cpu来说都是莫大的伤害。
相关文章推荐
- [LeetCode] Ugly Number (A New Question Added Today)
- 向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据
- 文件管理相关命令
- 我是如何自学Android,资料分享
- mybatis实现oracle批量插入,带序列(记录一下)
- 2015 多校联赛 ——HDU5400(水)
- (一二四)tableView的多组数据展示和手动排序
- 2015 多校联赛 ——HDU5400(水)
- Unity 2D教程: 滚动,场景和音效
- (一二四)tableView的多组数据展示和手动排序
- 贪心思想
- fig
- SQL语言的发展
- 九度oj-1079-手机键盘
- 阿峥教你实现UITableView循环利用
- untiy使用小技巧
- Android 多线程-----AsyncTask详解(康小岱已读)
- aauto学习系列之<4>:基础语法2
- 26. PHP 文件打开/读取/读取
- 全球主要气象气候研究部门及其共享数据集介绍