利用java创建不同元素的数组,其中奇数索引的元素是左邻的倍数的教程

105 阅读2分钟

给定一个整数N,任务是生成一个长度为N的数组A[],使其满足所有1≤i≤N-1的下列条件。

  • i为奇数时,Ai是Ai-1的倍数
  • i是偶数时,Ai 不是Ai-1的倍数
  • 所有的Ai都是成对不同的
  • 1 ≤Ai≤ 2⋅N

注意:如果有多个答案,请打印其中任何一个。

例子。

输入。 N = 4
**输出。**3 6 4 8
解释。 [3, 6, 4, 8]是一个有效的数组,因为:
A1 = 3 是 A2 = 6 的倍数
A2 = 6 不是 A3 = 4 的倍数
A3 = 4 是 A4 = 8 的倍数。

**输入。**N = 6
输出。 4 8 5 10 6 12

办法:根据以下观察,可以解决这个问题。

观察到的情况。

让x = N - ⌈N / 2⌉ + 1。那么,下面的序列是有效的。[x, 2⋅x, x + 1, 2⋅(x + 1), x + 2, ...] 。

  • 很容易看出,奇数索引的元素从x→N开始依次递增。同样地,偶数索引的元素从2⋅x→2⋅N(当N为奇数时从2⋅x→2⋅(N-1))依次递增。
  • 那么,2⋅x = 2⋅(N - ⌈N / 2⌉ + 1) > N意味着集合{x, x + 1, ..., N}和{2⋅x, 2⋅(x + 1), ..., 2⋅N}是不相连的。因此,上述序列的所有元素都是唯一的。
  • Ai是Ai-1的倍数可以被琐碎地验证为对所有奇数
    Ai不是Ai-1的倍数对所有偶数i都成立。

因此,所提供的序列满足了问题的所有要求,因此是有效的!

按照下面的步骤来解决这个问题。

  • 初始化一个变量oddElement = (N / 2) + 1,用于奇数索引元素。
  • 初始化一个变量evenElement = oddElement * 2用于偶数索引元素。
  • 在i上从1到N进行一次循环。
    • 如果i是奇数,打印奇数元素
      • 指定evenElement = oddElement * 2
      • 递增evenElement
    • 否则打印evenElement

下面是上述方法的实现。

java

// Java code to implement the approach
 
import java.io.*;
import java.util.*;
 
public class GFG {
 
    // Function to find array
    public static void find(int N)
    {
        int oddElement = N - (int)Math.floor(N / 2) + 1;
        int evenElement = 2 * oddElement;
 
        for (int i = 1; i <= N; i++) {
 
            // For odd indices
            if ((i % 2) != 0) {
                System.out.print(oddElement + " ");
                evenElement = 2 * oddElement;
                oddElement++;
            }
 
            // For even indices
            else {
                System.out.print(evenElement + " ");
            }
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int N = 4;
 
        // Function call
        find(N);
    }
}

输出

3 6 4 8 

时间复杂度。O(N)
辅助空间。 O(1)