假设A是一个整数数组,长度为n,数组中的元素可能是重复的。设计一个算法,找到一系列下标的集合I = {i(0), i(1),i(2)….i(n)}. 使得(A[i(0)] + A[i(1)] + … A[i(n)] ) mod n =0.例如假定A = {711, 704, 427, 995, 334, 62, 763, 98, 733,721}, 于是I = {0,1,3}, 因为(A[0] +A[1] + A[3] ) mod 10 = 0
public ArrayList<Integer> moduleSubSet(int[] A) {
// 判断数组A内的元素是否可以整除n
int[] B = new int[A.length];
for (int i = 0; i < B.length; i++) {
B[i] = 0;
}
int sum = 0;
ArrayList<Integer> subSet = new ArrayList<Integer>();
for (int i = 0; i < A.length; i++) {
B[ A[i] % A.length] = 1;
sum += A[i];
subSet.add(i);
int t = sum % A.length;
if (t == 0) {
return subSet;
}
if (i > 0 && B[t] == 1) {
Iterator<Integer> it = subSet.iterator();
int idx = 0;
while (it.hasNext()) {
int k = it.next();
if (A[k] % A.length == t) {
subSet.remove(idx);
return subSet;
}
idx++;
}
}
}
return null;
}
public static void main(String[] args) {
ArrayAndString as = new ArrayAndString();
int[] A = new int[]{711, 704, 427, 995, 334, 62, 763, 98, 733, 721};
ArrayList<Integer> subSet = as.moduleSubSet(A);
System.out.println("sub set is: ");
for (int i = 0; i < subSet.size(); i++) {
System.out.print(subSet.get(i) + " ");
}