算法洗脑系列(8篇)——第四篇 枚举思想

   今天分享一下枚举思想,这种思想也常是码畜,码奴常用的手段,经常遭到码农以上级别的鄙视,枚举思想可以说是在被逼无奈时最后的狂吼。

 

一: 思想

     有时我们解决某个问题时找不到一点规律,此时我们很迷茫,很痛苦,很蛋疼,突然我们灵光一现,发现候选答案的问题规模在百万之内,

此时我们就想到了从候选答案中逐一比较,一直找到正确解为止。

 

二: 条件

     前面也说了,枚举是我们在无奈之后的最后一击,那么使用枚举时我们应该尽量遵守下面的两个条件。

     ①   地球人都不能给我找出此问题的潜在规律。

     ②   候选答案的集合是一个计算机必须能够承受的。

 

三:举例

    下面是一个填写数字的模板,其中每个字都代表数字中的”0~9“,那么要求我们输入的数字能够满足此模板。

思路:首先拿到这个题,蛋还是比较疼的,因为找不到好的解题思路,仔细想想这属于查找类型的问题,常用的查找也就5种,能适合

        该问题的查找也就”顺序查找“和”二分查找“,然后仔细看看问题规模最多也就105=100000,其实根据“二分"的思想在这个问题

        中并不合适,最后只能用“顺序查找“了。

上代码:

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终于找出来了!");
				}
			}
		}

	}
}

 

运行结果:

 79365
X    7
-------
555555

费了:43次,TMD终于找出来了!


____________________________________________________________________________________________________________________

 

最后我们还是解决了问题,发现其中的时间复杂度达到了O(n2),这个复杂度理论上还是能接受的,还好我们的n在10以内,

n的每一次的自增对cpu来说都是莫大的伤害。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值