要求:
1.数组长度:100*3//100条长度为3的int型数组
2.每个元素在(-20,20)之间,随机
3.每组的3个元素不能重复或者互为相反数,比如1,1,2和1,-1,2是不被允许的
4,100组数据里任意两组不能重复或者完全取反,比如不能同时出现两组数据都是“ 1,2,3”,有1 2 3的话就不能同时出现-1 -2 -3。
就这样
1.数组长度:100*3//100条长度为3的int型数组
2.每个元素在(-20,20)之间,随机
3.每组的3个元素不能重复或者互为相反数,比如1,1,2和1,-1,2是不被允许的
4,100组数据里任意两组不能重复或者完全取反,比如不能同时出现两组数据都是“ 1,2,3”,有1 2 3的话就不能同时出现-1 -2 -3。
就这样
整个大算法都能出来了,就是这个数组,没有特别明确的思路
这里最好还是自己写算法
直接用API怕是很慢
结果一个split就解决了
新手的悲哀啊
int[][] arr = new int[100][3];
Random r = new Random();
while (list1.size()<100) {
List<Integer> list2 = new ArrayList<Integer>();
List<Integer> list3 = new ArrayList<Integer>();
while (list2.size()<3) {
int i = r.nextInt(21);
if (r.nextBoolean()) {
i = -i;
}
if (!list2.contains(-i) && !list2.contains(i)) {
list2.add(i);
list3.add(-i);
}
}
Collections.sort(list2);
Collections.sort(list3);
if (!list1.contains(list3) && !list1.contains(list2)) {
list1.add(list2);
}
} for (int i = 0; i < list1.size(); i++) {
List<Integer> lt = list1.get(i);
for (int j = 0; j < lt.size(); j++) {
arr[i][j] = lt.get(j);
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
public static void main(String[] args) { Set<Set<Integer>> set1 = new HashSet<Set<Integer>>();
int[][] arr = new int[100][3];
Random r = new Random();
while (set1.size()<100) {
Set<Integer> set2 = new HashSet<Integer>();
Set<Integer> set3 = new HashSet<Integer>();
while (set2.size()<3) {
int i = r.nextInt(21);
if (r.nextBoolean()) {
i = -i;
}
if (!set2.contains(-i)) {
set2.add(i);
set3.add(-i);
}
} if (!set1.contains(set3)) {
set1.add(set2);
}
} int idx1=0;
for (Set<Integer> lt: set1) {
int idx2=0;
for (Integer val:lt) {
arr[idx1][idx2] = val;
idx2++;
}
idx1++;
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
和同事讨论了半天这个问题
如果弄伪随机的话就可以比较快的构造了
上边用 set 进行去重也是可以
不过Java api 的效率一般是比较低的