In this HackerRank Absolute Permutation problem, you have Given n and k, print the lexicographically smallest absolute permutation P. If no absolute permutation exists, print -1.

HackerRank Absolute Permutation problem solution


Problem solution in Python programming.

#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
typedef long long LL;
typedef pair<int, int> PII;

int tt;
int n, k;
int a[100000];

int main() {
    scanf("%d", &tt);
    REP(test, tt) {
        scanf("%d%d", &n, &k);
        if (k == 0) {
            REP(i, n) printf("%d ", i + 1);
            printf("\n");
            continue;
        }
        if (n % (2 * k) != 0) {
            printf("-1\n");
            continue;
        }
        for (int pos = 0; pos < n; pos += 2 * k) {
            REP(i, k) {
                a[pos + i] = pos + k + i + 1;
                a[pos + k + i] = pos + i + 1;
            }
        }
        REP(i, n) printf("%d ", a[i]);
        printf("\n");
    }
    return 0;
}


Problem solution in Java Programming.

import java.io.*;
import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        for (int tt = 0; tt < t; tt++) {
            solve(in.nextInt(), in.nextInt());
            System.out.println();
        }
    }
    public static void solve( int n, int k) {
      if (k == 0) {
        for (int i = 1; i <= n; i++) {
          System.out.print(i + " ");
        }
        return;
      }
      if (n%2 == 1 || k > n/2) {
        System.out.print("-1");
        return;
      }
      solveAns(n,k);
    }
    static void solveAns(int n, int k) {
      boolean seen[] = new boolean[n+1];
      // 1 based indexing reminder!
      StringBuilder ans = new StringBuilder();
      for (int i = 1; i <= n; i++) {
        // try subtracting
        if ((i-k) > 0 && !seen[(i-k)]) {
          seen[(i-k)] = true;
          ans.append(i-k);
          ans.append(' ');
        } else if ((i+k) <= n && !seen[(i+k)]) {
          seen[(i+k)] = true;
          ans.append(i+k);
          ans.append(' ');
        } else {
          // impossible?
          System.out.print("-1");
          return;
        }
      }
      System.out.print(ans.toString());
    }
}


Problem solution in C++ programming.

#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <stdlib.h>
#include <memory.h>
using namespace std;
const int maxn=1000010;
int test,n,k,a[maxn];
bool kt[maxn];



int main()
{
    cin>>test;
    for (int t=1;t<=test;++t)
    {
        memset(kt,false,sizeof(kt));
        cin>>n>>k;
        if (k==0) for (int i=1;i<=n;++i) cout<<i<<" ";
        else
        if (n%(2*k)!=0) cout<<-1;
        else
        {
            for (int i=1;i<=n;++i) a[i]=i;
            for (int i=1;i<=n;++i)
                if (!kt[i])
                {
                    swap(a[i],a[i+k]);
                    kt[i]=true;
                    kt[i+k]=true;
                }
            for (int i=1;i<=n;++i) cout<<a[i]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}


Problem solution in C programming.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */    
    int t;
    scanf("%d",&t);
    while(t--)
        {
        int n,k;
        scanf("%d %d",&n,&k);
        int i,a[n+1],flag=0;
        if(k==0)
            {
            for(i=1;i<=n;i++)
                printf("%d ",i);
            printf("\n");
        }
        else
        {
            for(i=1;i<k+1;i++)
                {
                int temp=((n-i)/k)+1;
                if(temp%2)
                    {
                    flag=1;
                    break;
                }
            }
            if(flag==1)
                printf("-1\n");
            else
                {
                int j;
                for(i=1;i<k+1;i++)
                    {
                    for(j=i;j<=n-k;j+=2*k)
                        {
                        a[j]=j+k;
                        a[j+k]=j;
                    }
                }
                for(i=1;i<=n;i++)
                    printf("%d ",a[i]);
                printf("\n");
            }
        }
        
    }
    return 0;
}


Problem solution in JavaScript programming.

process.stdin.resume();
process.stdin.setEncoding('ascii');

var input_stdin = "";
var input_stdin_array = "";
var input_currentline = 0;

process.stdin.on('data', function (data) {
    input_stdin += data;
});

process.stdin.on('end', function () {
    input_stdin_array = input_stdin.split("\n");
    main();    
});

function readLine() {
    return input_stdin_array[input_currentline++];
}

/////////////// ignore above this line ////////////////////




function main() {
    var t = parseInt(readLine());
    for(var a0 = 0; a0 < t; a0++){
        var n_temp = readLine().split(' ');
        var n = parseInt(n_temp[0]);
        var k = parseInt(n_temp[1]);
        
        if(k==0){
            console.log(Array(n).fill(0).map((e,i)=>i+1).toString().replace(/,/g," "));            
        }
        else if((n/k)%2==0){
            let ar = Array(n).fill(0).map((e,i)=>i+1);
            for(let i = 0; i < n; i+=2*k){
                let j = i + k;
                let L = ar.slice(i,i+k);
                let R = ar.slice(j,j+k);
                ar.splice(i,k,...R);
                ar.splice(j,k,...L);
            }
            console.log(ar.toString().replace(/,/g," "));            
        }
        else{
            console.log(-1);
        }
        
    }

}