我正在尝试解决编码练习的Codility课程,而PermCheck就是其中之一.
[编辑]问题描述:
给出了由N个整数组成的非空零索引数组A. 置换是包含从1到N的每个元素一次且仅一次的序列.例如,数组A使得:
A[0] = 4
A[1] = 1
A[2] = 3
A[3] = 2
Run Code Online (Sandbox Code Playgroud)
是一个排列,但是数组A使得:
A[0] = 4
A[1] = 1
A[2] = 3
Run Code Online (Sandbox Code Playgroud)
不是排列,因为缺少值2.目标是检查阵列A是否是排列.编写函数:class Solution {public int solution(int [] A); 在给定零索引数组A的情况下,如果数组A是排列,则返回1,如果不是,则返回0.例如,给定数组A,使得:
A[0] = 4
A[1] = 1
A[2] = 3
A[3] = 2
Run Code Online (Sandbox Code Playgroud)
函数应返回1.给定数组A,使得:
A[0] = 4
A[1] = 1
A[2] = 3
Run Code Online (Sandbox Code Playgroud)
函数应返回0.假设:N是[1..100,000]范围内的整数; 数组A的每个元素是[1..1,000,000,000]范围内的整数.
我现在的解决方案是:
class Solution {
public int solution(int[] A) {
final int N = A.length;
long sum = N * (N+1)/2;
for(int i=0; i<A.length; i++) {
sum -= A[i];
}
return sum == 0 ? 1 : 0;
}
}
Run Code Online (Sandbox Code Playgroud)
而结果是不是我期待的.我知道有很多解决方案,但我想知道我的解决方案有什么问题.我错过了什么角落的案例.结果页面不显示上述解决方案失败的输入列表.
这不起作用的原因是,正如您的解决方案所假设的那样,排列(如所解释的)并不是达到特定总和的唯一方法。例如:
[0, 1, 2, 3] // Sum == 6
[0, 2, 2, 2] // Sum == 6
Run Code Online (Sandbox Code Playgroud)
根据所写的问题描述,我不认为这意味着给定的数据没有重复。