📌  相关文章
📜  生成1到N的排列,以使连续数的绝对差给出K个不同的整数

📅  最后修改于: 2021-04-27 21:12:35             🧑  作者: Mango

给定两个整数NK ,其中K ,则任务是生成从1N的整数排列,以使所有连续整数的绝对差值恰好给出K个不同的整数。

例子:

方法:通过简单的观察就可以轻松解决问题。在奇数索引处,递增顺序为1、2、3,… ,在偶数索引处,递减顺序为N,N-1,N-2,… ,依此类推。

对于N = 10 ,对于连续的绝对差,具有不同整数的置换可以是1 10 2 9 3 8 4 7 5 6 。连续的绝对差给出整数9、8、7 ,依此类推
因此,首先打印此序列的K个整数,然后使其余的差等于1 。该代码很容易说明。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to generate a permutation of integers
// from 1 to N such that the absolute difference of
// all the two consecutive integers give K distinct integers
void printPermutation(int N, int K)
{
    // To store the permutation
    vector res;
  
    int l = 1, r = N, flag = 0;
  
    for (int i = 0; i < K; i++) {
  
        if (!flag) {
  
            // For sequence 1 2 3...
            res.push_back(l);
            l++;
        }
        else {
  
            // For sequence N, N-1, N-2...
            res.push_back(r);
            r--;
        }
  
        // Flag is used to alternate between
        // the above if else statements
        flag ^= 1;
    }
  
    // Taking integers with difference 1
  
    // If last element added was r + 1
    if (!flag) {
        for (int i = r; i >= l; i--)
            res.push_back(i);
    }
  
    // If last element added was l - 1
    else {
        for (int i = l; i <= r; i++)
            res.push_back(i);
    }
  
    // Print the permutation
    for (auto i : res)
        cout << i << " ";
}
  
// Driver code
int main()
{
    int N = 10, K = 4;
  
    printPermutation(N, K);
  
    return 0;
}


Java
// Java implementation of the above approach
import java.util.Vector;
  
class GFG 
{
    // Function to generate a permutation 
    // of integers from 1 to N such that the 
    // absolute difference of all the two 
    // consecutive integers give K distinct integers
    static void printPermutation(int N, int K) 
    {
        // To store the permutation
        Vector res = new Vector<>();
  
        int l = 1, r = N, flag = 0;
  
        for (int i = 0; i < K; i++)
        {
            if (flag == 0) 
            {
                // For sequence 1 2 3...
                res.add(l);
                l++;
            } 
            else 
            {
                // For sequence N, N-1, N-2...
                res.add(r);
                r--;
            }
  
            // Flag is used to alternate between
            // the above if else statements
            flag ^= 1;
        }
  
        // Taking integers with difference 1
        // If last element added was r + 1
        if (flag != 1) 
        {
            for (int i = r; i >= l; i--) 
            {
                res.add(i);
            }
        } 
        // If last element added was l - 1
        else 
        {
            for (int i = l; i <= r; i++) 
            {
                res.add(i);
            }
        }
  
        // Print the permutation
        for (Integer i : res) 
        {
            System.out.print(i + " ");
        }
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int N = 10, K = 4;
        printPermutation(N, K);
          
    }
}
  
// This code is contributed by
// 29AjayKumar


Python3
# Python 3 implementation of the approach
  
# Function to generate a permutation 
# of integers from 1 to N such that the 
# absolute difference of all the two 
# consecutive integers give K distinct
# integers
def printPermutation(N, K):
  
    # To store the permutation
    res = list();
  
    l, r, flag = 1, N, 0
  
    for i in range(K):
  
        if flag == False:
              
            # For sequence 1 2 3...
            res.append(l)
            l += 1
      
        else:
              
            # For sequence N, N-1, N-2...
            res.append(r);
            r -= 1;
  
    # Flag is used to alternate between
    # the above if else statements
        flag = flag ^ 1;
  
    # Taking integers with difference 1
  
    # If last element added was r + 1
    if flag == False:
        for i in range(r, 2, -1):
            res.append(i)
  
    # If last element added was l - 1
    else:
        for i in range(l, r):
            res.append(i)
  
    # Print the permutation
    for i in res:
        print(i, end = " ")
  
# Driver code
N, K = 10, 4
printPermutation(N, K)
  
# This code is contributed by
# Mohit Kumar 29


C#
// C# implementation of the above approach
using System;
using System.Collections;
  
class GFG 
{
    // Function to generate a permutation 
    // of integers from 1 to N such that the 
    // absolute difference of all the two 
    // consecutive integers give K distinct integers
    static void printPermutation(int N, int K) 
    {
          
        // To store the permutation
        ArrayList res = new ArrayList();
  
        int l = 1, r = N, flag = 0;
        for (int i = 0; i < K; i++)
        {
            if (flag == 0) 
            {
                // For sequence 1 2 3...
                res.Add(l);
                l++;
            } 
            else
            {
                // For sequence N, N-1, N-2...
                res.Add(r);
                r--;
            }
  
            // Flag is used to alternate between
            // the above if else statements
            flag ^= 1;
        }
  
        // Taking integers with difference 1
        // If last element added was r + 1
        if (flag != 1) 
        {
            for (int i = r; i >= l; i--) 
            {
                res.Add(i);
            }
        } 
          
        // If last element added was l - 1
        else
        {
            for (int i = l; i <= r; i++) 
            {
                res.Add(i);
            }
        }
  
        // Print the permutation
        foreach (int i in res) 
        {
            Console.Write(i + " ");
        }
    }
  
    // Driver code
    public static void Main()
    {
        int N = 10, K = 4;
        printPermutation(N, K);        
    }
}
  
// This code is contributed by PrinciRaj1992


PHP
= $l; $i--) 
            array_push($res, $i); 
    } 
  
    // If last element added was l - 1 
    else 
    { 
        for ($i = l; $i <= $r; $i++) 
            array_push($res, $i); 
    } 
  
    // Print the permutation 
    for($i = 0; $i < sizeof($res); $i++)
        echo $res[$i], " ";
} 
  
// Driver code 
$N = 10;
$K = 4; 
  
printPermutation($N, $K); 
  
// This code is contributed by Ryuga
?>


输出:
1 10 2 9 8 7 6 5 4 3