当前位置: 首页 > 知识库问答 >
问题:

如何使用java中的lamda表达式查找缺失的最小正整数

桓嘉谊
2023-03-14

that,给定一个包含N个整数的数组A,返回A中不出现的最小正整数(大于0)。

例如,给定A=[1, 3, 6, 4, 1, 2],函数应该返回5。

给定A=[1,2,3],函数应该返回4。

给定一个=[−1.−3] ,函数应返回1。

为以下假设编写一个有效的算法:

import java.util.*;

class Main {

   /* Utility function that puts all non-positive
   (0 and negative) numbers on left side of
   arr[] and return count of such numbers */
   static int segregate(int arr[], int size)
   {
      int j = 0, i;
      for (i = 0; i < size; i++) {
         if (arr[i] <= 0) {
            int temp;
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            // increment count of non-positive
            // integers
            j++;
         }
      }

      return j;
   }

   /* Find the smallest positive missing
   number in an array that contains
   all positive integers */
   static int findMissingPositive(int arr[], int size)
   {
      int i;

      // Mark arr[i] as visited by making
      // arr[arr[i] - 1] negative. Note that
      // 1 is subtracted because index start
      // from 0 and positive numbers start from 1
      for (i = 0; i < size; i++) {
         int x = Math.abs(arr[i]);
         if (x - 1 < size && arr[x - 1] > 0)
            arr[x - 1] = -arr[x - 1];
      }

      // Return the first index value at which
      // is positive
      for (i = 0; i < size; i++)
         if (arr[i] > 0)
            return i + 1; // 1 is added becuase indexes
         // start from 0

         return size + 1;
      }

      /* Find the smallest positive missing
      number in an array that contains
      both positive and negative integers */
      static int findMissing(int arr[], int size)
      {
         // First separate positive and
         // negative numbers
         int shift = segregate(arr, size);
         int arr2[] = new int[size - shift];
         int j = 0;
         for (int i = shift; i < size; i++) {
            arr2[j] = arr[i];
            j++;
         }
         // Shift the array and call
         // findMissingPositive for
         // positive part
         return findMissingPositive(arr2, j);
      }
      // main function
      public static void main(String[] args)
      {
         int arr[] = { 0, 10, 2, -10, -20 };
         int arr_size = arr.length;
         int missing = findMissing(arr, arr_size);
         System.out.println("The smallest positive missing number is " + missing);
      }
   }
}

共有3个答案

空鸿云
2023-03-14

您还可以混合使用流和基本int循环:

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        int[] numberSet1 = {1, 3, 6, 4, 1, 2};
        int[] numberSet2 = {-1, -3};
        int[] numberSet3 = {1, 2, 3};
        System.out.println(calcularPrimero(numberSet1));
        System.out.println(calcularPrimero(numberSet2));
        System.out.println(calcularPrimero(numberSet3));
    }
    
    public static int calcularPrimero (int[] A) {
        //IntStream intStream = Arrays.stream(A).filter(x -> x >= 0).distinct().sorted();
        int[] B = Arrays.stream(A).filter(x -> x > 0).distinct().sorted().toArray();
        for (int i = 0, index = 1; i < B.length; i++, index++) {
            if (index != B[i]) {
                return index;
            }
        }
        return B.length + 1;
    }
}
蓬弘
2023-03-14

下面您可以使用Streams查找缺少的正整数-

int ar[] = { 0, 10, 2, -10, -20 }; 
        int max = Arrays.stream(ar).max().getAsInt();
        System.err.println("maxvalue "+max);


        int val = IntStream.range(1, max).filter(i->!Arrays.stream(ar).anyMatch(x->x==i))
                .findFirst().getAsInt();

        System.out.println(val);

        int[] val1 = IntStream.range(1, max).filter(i->!Arrays.stream(ar).anyMatch(x->x==i)).map(p->p).toArray();
        System.out.println("------------------");
        IntStream.of(val1).forEach(System.out::println);

        int[] valEven = IntStream.range(1, max).filter(i->Arrays.stream(val1).anyMatch(x->i%2==0)).map(p->p).toArray();
        System.out.println("------------------");
        IntStream.of(valEven).forEach(System.out::println);     

        int[] valOdd = IntStream.range(1, max).filter(i->!Arrays.stream(val1).anyMatch(x->i%2==0)).map(p->p).toArray();

        System.out.println("------------------");
        IntStream.of(valOdd).forEach(System.out::println);      


        int[] valOdd1 = IntStream.range(1, max).filter(i->Arrays.stream(val1).noneMatch(x->i%2==0)).map(p->p).toArray();

        System.out.println("------------------");
        IntStream.of(valOdd1).forEach(System.out::println);     

        int[] valEven1 = IntStream.range(1, max).filter(i->!Arrays.stream(val1).noneMatch(x->i%2==0)).map(p->p).toArray();

        System.out.println("------------------");
        IntStream.of(valEven1).forEach(System.out::println);        
董琦
2023-03-14

如果需要使用流,更直接但不是最佳的方法是创建一个无限流,从1开始,返回第一个不在arr中的流:

int[] arr = { 1, 3, 6, 4, 1, 2 };

Set<Integer> arrSet = Arrays.stream(arr).boxed().collect(Collectors.toSet());

Optional<Integer> found = IntStream.iterate(1, o -> o + 1).boxed()
        .filter(value -> !arrSet.contains(value))
        .findFirst();

found.ifPresent(System.out::println);

输出

5

正如所指出的,这是非常低效的,但就计算复杂度而言,我相信是最佳的,至少对于最坏的情况,即您必须查看所有元素的情况。

 类似资料:
  • 我有一个100个随机整数的列表。每个随机整数都有一个从0到99的值。重复是允许的,所以列表可以是这样的 我需要找到最小的整数( 我最初的解决方案是这样的: 但这需要一个用于记账的辅助数组和第二次(可能是完整的)列表迭代。我需要执行这个任务数百万次(实际应用程序是在贪婪的图形着色算法中,我需要用顶点邻接列表找到最小的未使用颜色值),所以我想知道是否有一种聪明的方法可以在没有太多开销的情况下获得相同的

  • 本文向大家介绍请你说说Lamda表达式的优缺点。相关面试题,主要包含被问及请你说说Lamda表达式的优缺点。时的应答技巧和注意事项,需要的朋友参考一下 考察点:Java基础 优点:1. 简洁。2. 非常容易并行计算。3. 可能代表未来的编程趋势。 缺点:1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)2. 不容易调试。3. 若其他程序员没

  • 问题内容: 谁能给我一个Java正则表达式来识别字符串中的重复字符?我只是在寻找立即重复的字符,它们可以是字母或数字。 例: abccde <-寻找此内容(立即重复c的内容) abcdce <-不是这个(c用另一个字符分隔) 问题答案: 尝试 在任何单词字符(字母,数字或下划线)和匹配无论是在第一组括号,一次或多次的比赛。因此,您可以匹配出现的任何一个单词字符,然后立即再次匹配一个或多个相同的单词

  • 我有学生类的数组。学生类有两个字段1.private最后的字符串firstName;2.private最后的布尔值是当前; 如果学生处于非活动状态,在学生类中出现的检查当前api将给出错误的值。 下面是我的DTO课程。 现在我想知道最常见的不活跃学生的名字? 我想这样做,与平行流? 什么是并行流代码?

  • 经典的问题陈述是:给定一个未排序的整数数组,找到中不存在的最小正整数。 在一个经典的问题陈述中,你只得到一个数组,你可以在这里、这里和这里找到很多关于这个问题的解决方案和资源。 在我的问题中,你得到了两个数组,和,长度均为。构造一个长度为 的数组 ,其“最小缺失整数”是可能的最大值。 必须是 或 。 我们如何以< code>O(N)的最坏情况时间和空间复杂度解决这个问题? 假设: