Task description
A non-empty zero-indexed array A consisting of N integers is given.
A permutation is a sequence containing each element from 1 to N once, and only once.
For example, array A such that:
A[0] = 4
A[1] = 1
A[2] = 3
A[3] = 2
is a permutation, but array A such that:
A[0] = 4
A[1] = 1
A[2] = 3
is not a permutation.
The goal is to check whether array A is a permutation.
Write a function:
int solution(int A[], int N);
that, given a zero-indexed array A, returns 1 if array A is a permutation and 0 if it is not.
For example, given array A such that:
A[0] = 4
A[1] = 1
A[2] = 3
A[3] = 2
the function should return 1.
Given array A such that:
A[0] = 4
A[1] = 1
A[2] = 3
the function should return 0.
Assume that:
N is an integer within the range [1..100,000];
each element of array A is an integer within the range [1..1,000,000,000].
Complexity:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
Copyright 2009�C2014 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.
Solution C:42
#define FLAG(N) (((N)>>30)&0x3) #define VALUE(N) ((N)&(0xffffffff>>2)) #define SET_FLAG(N, flag) ((N)|((flag)<<30)) #define NOT_VISITED 0 #define VISITED 1 int solution(int A[], int N) { int notFound = N; char* reason = "good"; int i = 0; for( i = 0; i < N; i++ ) { int value = VALUE(A[i]); if(value > N) { // 数字超过N,不可能是全排列 reason = "overflow"; break; } int next = value - 1; if( FLAG(A[next]) == NOT_VISITED ) { A[next] = SET_FLAG( A[next], VISITED); notFound --; } else { // 出现重复的元素, 不可能是全排列 reason = "duplicate"; break; } } //printf("reason:%s", reason); return (notFound == 0); }
寻求更好地解法