【问题标题】:Generate all contiguous sequences from an array从数组生成所有连续序列
【发布时间】:2015-11-25 08:38:26
【问题描述】:

有一个数组说 [1,2,4,5,1]。我需要从中打印所有连续的子数组。

输入:[1,2,4,5,1]

输出:

 1
 1,2
 1,2,4
 1,2,4,5
 1,2,4,5,1
 2
 2,4
 2,4,5
 2,4,5,1
 4
 4,5
 4,5,1
 5
 5,1
 1

我尝试过,但无法获得完整的系列。

//items is the main array
for(int i = 0; i < items.length; i++) {
    int num = 0;
    for(int j = 0; j < items.length - i; j++) {
        for(int k = i; k < j; k++) {
            System.out.print(items[k]);
        }
        System.out.println();
    }
}

【问题讨论】:

  • 那么...您的实际问题是什么?你被什么困住了?
  • @Stultuske 我没有得到确切的系列!我正在寻找一个合适的逻辑来做到这一点。

标签: java arrays logic


【解决方案1】:

您只需进行 2 处更改。外部循环迭代的次数与数组中的元素一样多,这是正确的。第一个内循环应该使用外循环的索引作为开始索引 (int j = i),否则你总是从第一个元素开始。然后将内部循环中断条件更改为k &lt;= j,否则i 不会打印最后一个元素。

// i is the start index
for (int i = 0; i < items.length; i++)
{
    // j is the number of elements which should be printed
    for (int j = i; j < items.length; j++)
    {
        // print the array from i to j
        for (int k = i; k <= j; k++)
        {
            System.out.print(items[k]);
        }
        System.out.println();
    }
}

【讨论】:

  • 是否可以在少于 3 个循环内完成?
  • @AliAkram 该算法的运行时复杂度为 O(n²),因此您至少需要两个循环。我的代码仅使用两个循环来生成序列。第三个循环仅用于打印。您可以将内部循环替换为System.out.println(Arrays.toString(Arrays.copyOfRange(items, i, j + 1)));
  • @AliAkram 是的,可以使用少于 3 个循环。看这里:stackoverflow.com/a/70754152/11421611
【解决方案2】:

经过测试并且可以正常工作!试试这个算法。

for(int i=0;i<items.length;i++) {

        for(int j=i;j<items.length;j++) {

            for(int k=i;k<=j;k++) {

                System.out.print(items[k]);
            }
            System.out.println();
        }
}

【讨论】:

    【解决方案3】:

    问题似乎与您的第二个循环有关:

    for(int j=0;j<items.length-i;j++)
    

    你总是在前 i 个地方跑。您要做的是从 i 运行到数组的末尾,如下所示:

    for(int j=i;j<items.length;j++)
    

    【讨论】:

      【解决方案4】:

      我认为这可能会有所帮助

      for(int i=0;i<=items.length-1;i++)
      {
          for(int l=i;l<=items.length;l++)
          {
          int b[]=Arrays.copyOfRange(a, i,l);
      
              for(int k=0;k<=b.length-1;k++)
              {
                  System.out.print(b[k]);
              }
      
              System.out.println();
          }
      }
      

      【讨论】:

        【解决方案5】:

        试试这个方法。

        int items[]={1,2,4,5,1};
        for(int i=0;i<=items.length;i++)//items is the main array 
        {
            int num=0;
            for(int j=0;j<items.length;j++)
            {
                for(int k=i;k<=j;k++)
                {
                    System.out.print(items[k]);
                }
        
                System.out.println();
            }
        }
        

        【讨论】:

        • 输出是正确的,但是行之间有很多额外的空格:)
        【解决方案6】:

        使用下面的代码:

        import java.io.*;
        class stack
        {
            public static void main(String args[]) throws IOException
            {
                int items[]={1,2,4,5,1};
        
                for(int i=0;i<items.length;i++)//items is the main array 
                {
                    for(int j=i;j<items.length;j++)
                    {
                        for(int k=i;k<=j;k++)
                        {
                            System.out.print(items[k]);
                            if (k==j)
                                continue;
                            else
                                System.out.print(",");
                        }
                        System.out.println();
                    }
                }
            }
        }
        

        【讨论】:

          【解决方案7】:
          // Javascript.
          // Generate Array and print it.
          function subArray(arr) {
              if (arr.length < 1) return 0;
              if (arr.length < 2) return arr[0];
          
              let result = [];
              for (let i = 0; i < arr.length; i++) {
                  const temp = [];
                  for (let j = i; j < arr.length; j++) {
                      temp.push(arr[j]);
                      result.push([...temp]);
                      console.log(temp.join(','));
                  }
              }
              return result
          }
          
          // Calculate only Sum of the subarrays.
          function subArrSum(arr) {
            if (arr.length < 1) return 0;
            if (arr.length < 2) return arr[0];
          
            let sum = 0;
            for (let i = 0; i < arr.length; i++) {
                sum += (arr.length - i) * (i + 1) * arr[i];
            }
            return sum;
          }
          

          【讨论】:

          • 使用循环两次。为了得到总和,我建议使用子数组的模式。
          【解决方案8】:

          有一种更好的方法可以花费更少的时间:

          输入:

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

          代码:

          int j = 0;
          StringBuilder sb = new StringBuilder();
          
          for(int i = 0; i < items.length; i++){ 
          
             sb.setLength(0);
             j = 0;
             sb.append(items[i]+ " ");
             System.out.print(sb.toString()+ " ");
             System.out.println();
          
             j=i+1;
             
             while(j< items.length){
          
                 sb.append(arr.get(j) + " ");
                 System.out.print(sb.toString() +" ");
                 System.out.println();
          
                 j = j+1;
             }
             System.out.println();
             }
          

          输出:

            1
            1 2
            1 2 3
            1 2 3 4
          
            2 
            2 3
            2 3 4
            
            3
            3 4
          
            4
          

          【讨论】:

            【解决方案9】:

            试试这样的:

            for(int i=0; i<items.length; i++)
            {
               for(int j=i; j<items.length; j++)
               {
                  System.out.print(items[j]);
               }
               System.out.println();
            }
            

            我还没有测试,但它应该可以工作。

            【讨论】:

            • 不,它不起作用。它打印整个数组,然后只打印最后四个元素,然后是最后三个元素,依此类推...
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-25
            • 2021-05-27
            • 2015-11-05
            • 2013-03-03
            • 1970-01-01
            • 2015-10-13
            相关资源
            最近更新 更多