我有一个问题,我正在编写一个算法。我给第一行是int Print-3-element-subsets(int n,int s [])。我的算法似乎不正确。请帮我。
编写一个函数,打印出数组S中元素的所有3元素子集(索引从1到n)。不要打印相同的子集两次,并确保每个子集恰好有3个元素。
int Print-3-element-subset(int n, int s[])
{
for(int i =0; i<n; i++)
for(int j=n; j<i; j--)
for(int k =n ; k<i; j--)
print("{"+s[i]+ ", "+s[j]+"," +s[k]+"}");
}
答案 0 :(得分:1)
这样的事情应该有效:
void print3elementSubsets(int[] s) {
int n = s.length;
for(int i = 0; i < n-2; i++) {
for(int j = i+1; j < n-1; j++) {
for(int k = j+1 ; k < n; k++) {
print("{"+s[i]+ ", "+s[j]+"," +s[k]+"}");
}
}
}
}
如果您遇到这样的问题,请先使用纸和铅笔以使索引正确。绘制数组,考虑i
应该从哪里开始和结束等。不要直接进入编程并尝试“调整”代码,直到它适合。
答案 1 :(得分:0)
这样的东西也适用于小子集
void printThreeElementSubsets(int[] s) {
int n = s.length;
for (int mask = 0; mask < (1 << n); ++mask) {
if (Integer.bitCount(mask) == THREE) {
for (int i = 0; i < n; ++i) {
if ((mask & (i << 1)) != 0)
System.out.print(s[i] + " ");
}
System.out.println();
}
}
}
它保证子集只打印一次。