java hashset 效率_Java集合效率问题

凑算式

B DEF

A + --- + ------- = 10

C GHI

(如果显示有问题,可以参见【图1.jpg】)

6afdd160f140723f2052c8b0cfecdeaa.png

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:

6+8/3+952/714 就是一种解法,

5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

显然可以用暴力算法,但是需要排除元素的重复问题,刚开始我用的是Java内置的Set集合,运行时间特别长

package lanqiao2016;

import java.util.concurrent.ConcurrentSkipListSet;

public class T3_array {

public static void main(String[] args) {

int a = 0;

int b = 0;

int c = 0;

int d = 0;

int e = 0;

int f = 0;

int g = 0;

int h = 0;

int i = 0;

int count = 0;

ConcurrentSkipListSet intSet = new ConcurrentSkipListSet();

for(a=1; a<=9; a++)

{

if(a > 10)

continue;

for(b=1; b<=9; b++)

{

for(c=1; c<=9; c++)

{

if(a + b/c > 10)

continue;

for(d=1; d<=9; d++)

{

for(e=1; e<=9; e++)

{

for(f=1; f<=9; f++)

{

for(g=1; g<=9; g++)

{

for(h=1; h<=9; h++)

{

for(i=1; i<=9; i++)

{

intSet.clear();

intSet.add(a);

intSet.add(b);

intSet.add(c);

intSet.add(d);

intSet.add(e);

intSet.add(f);

intSet.add(g);

intSet.add(h);

intSet.add(i);

if(a + (double)b/c + (double)(d*100+e*10+f)/(double)(g*100+h*10+i) == 10

&& intSet.size() == 9)

{

count++;

}

}

}

}

}

}

}

}

}

}

System.out.println(count);

}

}

后来改成直接的逻辑判断,几乎瞬间得出结果

package lanqiao2016;

public class T3 {

public static void main(String[] args) {

int a = 0;

int b = 0;

int c = 0;

int d = 0;

int e = 0;

int f = 0;

int g = 0;

int h = 0;

int i = 0;

int count = 0;

for(a=1; a<=9; a++)

{

if(a > 10)

continue;

for(b=1; b<=9; b++)

{

for(c=1; c<=9; c++)

{

if(a + b/c > 10)

continue;

for(d=1; d<=9; d++)

{

for(e=1; e<=9; e++)

{

for(f=1; f<=9; f++)

{

for(g=1; g<=9; g++)

{

for(h=1; h<=9; h++)

{

for(i=1; i<=9; i++)

{

if(

a==b || a==c || a==d || a==e || a==f || a==g || a==h || a==i ||

b==c || b==d || b==e || b==f || b==g || b==h || b==i ||

c==d || c==e || c==f || c==g || c==h || c==i ||

d==e || d==f || d==g || d==h || d==i ||

e==f || e==g || e==h || e==i ||

f==g || f==h || f==i ||

g==h || g==i ||

h==i

)

continue;

if(a + (double)b/c + (double)(d*100+e*10+f)/(double)(g*100+h*10+i) == 10)

{

count++;

}

}

}

}

}

}

}

}

}

}

System.out.println(count);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值