Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何使用流(java.util.stream)处理嵌套for循环中的数组?_Arrays_For Loop_Functional Programming_Java Stream - Fatal编程技术网

Arrays 如何使用流(java.util.stream)处理嵌套for循环中的数组?

Arrays 如何使用流(java.util.stream)处理嵌套for循环中的数组?,arrays,for-loop,functional-programming,java-stream,Arrays,For Loop,Functional Programming,Java Stream,下面是我试图为上下文解决的问题:“给定一个整数数组nums和一个整数目标,返回两个数字的索引,使它们相加到目标 您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素 你可以按任何顺序返回答案。” 我想知道是否有可能使用流来解决这个问题。。。 这是我的密码: class Solution { public int[] twoSum(int[] nums, int target) { int num1=0; int num2=0; for

下面是我试图为上下文解决的问题:“给定一个整数数组nums和一个整数目标,返回两个数字的索引,使它们相加到目标

您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素

你可以按任何顺序返回答案。” 我想知道是否有可能使用流来解决这个问题。。。 这是我的密码:


class Solution {
   
    public int[] twoSum(int[] nums, int target) {
    int num1=0;
    int num2=0;
    
    for(int i=0; i<nums.length; i++){
        for(int j=0; j<nums.length; j++){
            if(i==j)
                j++;
            if(j>=nums.length)
                break;
            if(nums[i]+nums[j]==target){
                num1=i;
                num2=j;
            }//end of 3rd if
        }//end of 2nd loop
    }//end of 1st loop
       int[] sol={num1,num2} ;
        return sol;
    }//end method
}

类解决方案{
公共int[]twoSum(int[]nums,int目标){
int num1=0;
int num2=0;

对于(inti=0;i,这里有几种可能性。 这是数据和目标

int[] nums = { 1, 10, 12, 3, 19, 33 };
int target = 43;
第一个基本上是嵌套的
IntStream

  • 它将
    i=0的整数流到nums.length-1
  • 对于
    k=i+1到nums.长度
  • 筛选与目标求和的第一个解决方案
  • 然后它将索引保存在一个数组中并
  • 返回包含解决方案的数组。或-1,-1
首先根据建议修改过滤解决方案

int[] result = IntStream.range(0, nums.length - 1)
        .mapToObj(i -> IntStream.range(i + 1, nums.length)
                .filter(k -> nums[i] + nums[k] == target)
                .mapToObj(k -> new int[] { i, k }))
        .flatMap(a -> a).findFirst()
        .orElse(new int[] { -1, -1 });
此解决方案类似,只是它使用不同的方法生成索引

  • 使用除法和余数运算符生成所有可能的索引对
  • 如果索引相同,则添加条件以跳过测试
  • 在这两种情况下,如果未能满足条件,则返回-1,-1的数组
对于给定的数组和目标,都打印

        
[1,5]
请记住,这些都不比简单的嵌套循环解决方案更有效。如果提供的数组仅由正数组成,则可以通过跳过已超过目标的单个值来提高循环解决方案的效率。一旦找到解决方案,就必须打破循环

就您最初的解决方案而言,它可以改进如下:

  • i=0到nums.length-1开始外部循环
  • 内部循环从
    j=i+1变为nums.length
    。因此i和j永远不会是相同的值
  • 一旦找到第一个解决方案,就打破循环
类解决方案{
公共int[]twoSum(int[]nums,int目标){
int结果[]={-1,-1};
外部:用于(int i=0;i
如果一个数字在数组中出现两次,我可以同时使用两次吗?OP说不能使用同一个元素两次。但我认为数组中两个不同位置的相同值将是两个不同的元素。当然,如果目标是奇数,则与此无关。好主意。我没有考虑到这一点。我会做出更改。t汉克斯回答说:“我真的忍不住了:)
        
[1,5]
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int result[] = { -1, -1 };
        outer: for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    result[0] = i;
                    result[1] = j;
                    break outer;
                }
            }
        }
        return result;
    }
}