【问题标题】:Find the first that have most distinct digit by lambda expression通过 lambda 表达式找到第一个具有最明显数字的
【发布时间】:2020-11-18 01:35:28
【问题描述】:

目前,我正在使用相同的 lambda 表达式学习 distinct() 的功能: 第一个用于查找整数的不同数字

Integer intVar = 12341234;
long c1 = intVar.toString().chars().distinct().count(); // (1,2,3,4)
System.out.println(c1);//result = 4  

然后我想尝试在一个范围内找到相同的东西, 我的想法是:

1.loop from 1 to 1_000_000
2.filter isSquareNumber && <= 9_999_999 && 1_000_000
3.convert to char
4.distinct
5.store as list(key,value)
6.findfirst key with value=7

因为原始代码有效但看起来很糟糕

int inte = IntStream.iterate(1, i-> i + 1)
        .filter(i->isSquareNumber(i) && i<= 9999999 && i>=1000000)
        .filter(i-> i%10!=i/10%10 && i%10!=i/100%10 && i%10!=i/1000%10 && i%10!=i/10000%10 && i%10!=i/100000%10 && i%10!=i/1000000%10)
        .filter(i-> i/10%10!=i/100%10 && i/10%10!=i/1000%10 && i/10%10!=i/10000%10 && i/10%10!=i/100000%10 && i/10%10!=i/1000000%10)
        .filter(i-> i/100%10!=i/1000%10 && i/100%10!=i/10000%10 && i/100%10!=i/100000%10 && i/100%10!=i/1000000%10)
        .filter(i-> i/1000%10!=i/10000%10 && i/1000%10!=i/100000%10 && i/1000%10!=i/1000000%10)
        .filter(i-> i/10000%10!=i/10%10 && i/10000%10!=i/100000%10)
        .filter(i-> i/100000%10!=i/1000000%10)
        .findFirst()
        .getAsInt();
System.out.println(inte);//result = 1034289

WJS 帮助版

IntStream
        .iterate(1, i-> i + 1)
        .filter(i->isSquareNumber(i) && i<= 9999999 && i>=1000000)
        .mapToObj(i->new String[] {Integer.toString(i), Arrays
                .stream(Integer.toString(i).split(""))
                .filter(a -> a[1].length() >= 7)
                .findFirst()
                .ifPresent(a -> System.out
                .println(a[1] + " --> " + a[1].length()));

效果很好。现在我正尝试再迈出一步,创建一个方法,其中返回类型是整数并返回最不同的数字整数,而不是布尔值。

【问题讨论】:

  • “在一个范围内找到相同的东西”是什么意思?你能给出一些输入和输出的例子吗,就像你用一个整数做的那样?
  • @Sweeper 输入:1 输出:1 输入:12 输出:2 输入:121 输出:2 // 1 出现两次,2 出现一次,依此类推
  • @Sweeper 哦,这意味着我想对从 1 到 1000000 等的所有整数做同样的事情
  • 您想找出 10 M 以下的第一个数字,它是一个正方形,由七个不同的数字组成?
  • @Bohemian 是的,它用于查找7个不同的数字,甚至更多,它可以首先确定有多少个不同的数字,然后存储为数组或变量以供进一步使用。

标签: java lambda


【解决方案1】:

试试这个。我将其限制为前 10 个值。

  • mapToObj 创建一个字符串数组。
  • 第一项是原始值。
  • 下一个拆分字符串,消除重复并重新加入新字符串
IntStream.range(100000, 1000000).limit(10)
        .mapToObj(i->new String[] {Integer.toString(i), Arrays
                .stream(Integer.toString(i).split(""))
                .distinct().collect(Collectors.joining(""))})
        .forEach(a->System.out.println(a[0] + " --> " + a[1]));

打印

100000 --> 10
100001 --> 10
100002 --> 102
100003 --> 103
100004 --> 104
100005 --> 105
100006 --> 106
100007 --> 107
100008 --> 108
100009 --> 109

找出第一个有 7 个不同数字的数字。

在上一个示例中创建数组后,将 forEach 替换为过滤器,然后是 findFirst,然后打印值(如果存在)。

IntStream.range(1000000, 10000000)
        .mapToObj(i -> new String[] { Integer.toString(i),
                Arrays.stream(Integer.toString(i).split(""))
                        .distinct()
                        .collect(Collectors.joining("")) })
        .filter(a -> a[1].length() >= 7).findFirst()
        .ifPresent(a -> System.out
                .println(a[1] + " --> " + a[1].length()));

打印

1023456 --> 7

【讨论】:

  • mapToObj 部分的工作类似于 List(key,value)?,那么如果我想 .count() 值部分来获取唯一数字的出现,比如 [input:12344321,输出: 12344321 -> 4 ]
  • 哦,顺便说一句,谢谢你教我一种在流中使用流的新方法,这增加了灵活性
  • 不客气。我认为您上一个问题中的 4 是指不同数字的数量。
  • 是的,我想找到整数的不同数字并找到第一个具有 1、2、3、...7 个不同数字的数字,依此类推
  • 哦,您的代码提醒我,我忘记了您的 a[1] 再次作为字符串收集,并且可以在 .map() 之后进行过滤。我对多层流和数组真的很陌生跨度>
【解决方案2】:

要查找所有至少有 7 个不同数字的正方形数字:

int[] all = IntStream.range(1000, (int) Math.sqrt(10_000_000))
    .map(i -> i * i)
    .filter(i -> Integer.toString(i).chars().distinct().count() > 6)
    .toArray();

只找到第一个(或爆炸尝试,但有 123 个):

int first = IntStream.range(1000, (int) Math.sqrt(10_000_000))
    .map(i -> i * i)
    .filter(i -> Integer.toString(i).chars().distinct().count() > 6)
    .findFirst()
    .orElseThrow(RuntimeException::new);

我不是对每个数字进行迭代,而是对平方根进行迭代,然后对其进行平方,因此效率更高。

【讨论】:

  • 天哪,你完美地解决了我的问题,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2010-09-28
相关资源
最近更新 更多