We define P to be a permutation of the first n natural numbers in the range [1,n]. Let pos[i] denote the value at position i in permutation P using 1-based indexing.
P is considered to be an absolute permutation if |posi[i]-i]=k holds true for every i belongs to [1,n].
Given n and k, print the lexicographically smallest absolute permutation . If no absolute permutation exists, print -1.
For example, let n=4 giving us an array pos=[1,2,3,4]. If we use 1 based indexing, create a permutation where every |pos[i]-1| = k. If k=2, we could rearrange them to [3,4,1,2]:
pos[i] i |Difference| 3 1 2 4 2 2 1 3 2 2 4 2
Function Description
Complete the absolutePermutation function in the editor below. It should return an integer that represents the smallest lexicographically smallest permutation, -1 or if there is none.
absolutePermutation has the following parameter(s):
n: the upper bound of natural numbers to consider, inclusive
k: the integer difference between each element and its index
Input Format
The first line contains an integer t, the number of test cases.
Each of the next t lines contains 2 space-separated integers, n and k.
Output Format
On a new line for each test case, print the lexicographically smallest absolute permutation. If no absolute permutation exists, print -1.
Sample Input
3 2 1 3 0 3 2
Sample Output
2 1 1 2 3 -1
Absolute Permutation HackerRank Solution in C
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
int i,j,n,t,k;
scanf("%d",&t);
while(t>0){
t--;
scanf("%d %d",&n,&k);
if(k==0){
for(i=0;i<n;i++)printf("%d ",i+1);
printf("\n");
continue;
}
if((n%(2*k))!=0){
printf("-1\n");
continue;
}
for(i=0;i<(n/(2*k));i++){
for(j=0;j<k;j++)printf("%d ",((2*k*i)+k+j+1));
for(j=0;j<k;j++)printf("%d ",((2*k*i)+j+1));
}
printf("\n");
}
return 0;
}
Absolute Permutation HackerRank Solution in C++
#include <bits/stdc++.h>
using namespace std;
int N, K;
int A[100000];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &N, &K);
memset(A, -1, sizeof A);
bool bad=false;
for(int i=0; i<N; i++)
{
if(i-K>=0 && A[i-K]==-1)
A[i-K]=i;
else if(i+K<N && A[i+K]==-1)
A[i+K]=i;
else
bad=true;
}
if(bad)
printf("-1\n");
else
{
for(int i=0; i<N; i++)
printf("%d ", A[i]+1);
printf("\n");
}
}
return 0;
}
Absolute Permutation HackerRank Solution in Java
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int tc = scanner.nextInt();
for (int t = 0; t < tc; ++t) {
int n = scanner.nextInt();
int k = scanner.nextInt();
print(solve(n, k));
}
}
private static int[] solve(int n, int k) {
if (k > 0 && n % (2 * k) != 0) {
return null;
}
int[] res = new int[n];
int shift = k;
for (int i = 1; i <= n; ++i) {
res[i - 1] = i + shift;
if (k > 0 && i % k == 0) {
shift *= -1;
}
}
return res;
}
private static void print(int[] a) {
if (a == null) {
System.out.println(-1);
return;
}
for (int i = 0; i < a.length; ++i) {
if (i > 0) {
System.out.print(" ");
}
System.out.print(a[i]);
}
System.out.println();
}
}
Absolute Permutation HackerRank Solution in Python
def solve(N,K):
if K == 0: return range(1,1+N)
if N%(2*K): return [-1]
base = range(K+1,2*K+1) + range(1,1+K)
ans = []
Q = N/(2*K)
for q in xrange( Q ):
for i in base:
ans.append( q*2*K + i )
return ans
rr = raw_input
rrI = lambda: int(rr())
rrM = lambda: map(int,rr().split())
for _ in xrange(rrI()):
print " ".join(map(str, solve(*rrM())))
Absolute Permutation HackerRank Solution in C#
using System;
using System.Linq;
class Solution
{
static void Main(String[] args)
{
var cases = int.Parse(Console.ReadLine());
for (var c = 0; c < cases; ++c)
{
DoCase();
}
}
private static void DoCase()
{
var t = Console.ReadLine().Split(' ');
var n = int.Parse(t[0]);
var k = int.Parse(t[1]);
if (k == 0)
{
Console.WriteLine(string.Join(" ", Enumerable.Range(1, n)));
return;
}
if (n % (2 * k) != 0)
{
Console.WriteLine(-1);
return;
}
var blocks = n / 2 / k;
var r = Enumerable.Range(1, n).ToArray();
for (var i = 0; i < blocks; ++i)
{
var offset1 = 2 * k * i;
var offset2 = 2 * k * i + k;
for (var j = 0; j < k; ++j, ++offset1, ++offset2)
{
var v = r[offset1];
r[offset1] = r[offset2];
r[offset2] = v;
}
}
Console.WriteLine(string.Join(" ", r));
}
}
Attempt Absolute Permutation HackerRank Challenge
Link – https://www.hackerrank.com/challenges/absolute-permutation/
Next HackerRank Challenge Solution
Link – https://exploringbits.com/the-bomberman-game-hackerrank-solution/
Aayush Kumar Gupta is the founder and creator of ExploringBits, a website dedicated to providing useful content for people passionate about Engineering and Technology. Aayush has completed his Bachelor of Technology (Computer Science & Engineering) from 2018-2022. From July 2022, Aayush has been working as a full-time Devops Engineer.
Simplest Logic guys:))
if(k!=0 && n%(2*k)!=0)
{
printf(“-1\n”);
return;
}
else
{
for(i=1;i<=n;i++)
{
arr[i] = i + (pow(-1,1+r) * k);
printf("%ld ",arr[i]);
c++;
if(c==k)
{
c = 0;
r++;
}
}
}
Thanks Abhishek