首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

判断一个整数数组,判断此中是否有三个数和为0 求简单的算法或思路

2013-08-16 
判断一个整数数组,判断其中是否有三个数和为0 求简单的算法或思路package 数组3个数为0public class Test

判断一个整数数组,判断其中是否有三个数和为0 求简单的算法或思路

package 数组3个数为0;

public class Test {
public static void main(String[] args) {
int [] a={-5,2,1,14,6,-3};
int x=-1;
for(int i=0;i<a.length;i++){
int q=a[i];
x=i;
x++;
System.out.println("q="+q);
for(int j=x;j<a.length;j++){
System.out.println("第二层"+a[j]);
int w=q+a[j];
System.out.println("w="+w);
x++;
for(int k=x;k<a.length;k++){
System.out.println("第三层"+a[k]);
int e=w+a[k];
System.out.println("e="+e);
if(e==0){
System.out.println("成功"+e);
System.exit(0);
}
}
}
}
}


}


自己写的太复杂了。。 
[解决办法]
随便写了个,看看有哪不对?
public class TestMain {
public static void main(String[] args) {
int[] arr = { -5, 2, 1, 14, 6, -3 };
int sum= 0; //要求的和
calculate(sum,arr);
}

public static void calculate(int sum,int[] arr) {
int count = 0;
for (int i = 0; i <arr.length; i++) {
for (int j = i+1; j <arr.length; j++) {
for (int k = j+1; k <arr.length; k++) {
if (arr[i] + arr[j] + arr[k] == sum) {
count++;
System.out.println("第"+count+"组:"+arr[i]+"+"+arr[j]+"+"+arr[k]+"="+sum);
}
}
}
}
}
}

[解决办法]
/***
 * the times target occur in <code>int[] ints</code>
 * 
 * @param ints
 * @param target
 * @return
 */
public static int count(int[] ints, int target) {
int count = 0;
for (int i = 0; i < ints.length; i++) {


if (ints[i] == target) {
count++;
}
}
return count;
}
[解决办法]
不见得简单的方法,不过如果你把题目改成30个数相加是否有0,也只需要把MAX_LEVEL改成30就行了。至于效率嘛。。。

private static int MAX_LEVEL = 3;
public void main (String [] args) {
  int[] arr = {2,4,5,0,-4,-2};
  check (arr, -1, 1, 0);
}

void check (int[] arr, int index, int level, int sum) {
  if (level > MAX_LEVEL) return;

  for (int i = index + 1; i < arr.length; i++) {
    if (level == MAX_LEVEL) {
      if (sum + arr[i] == 0) {
        System.out.println("oh yeah!");
        exit(0);
      }
    }
    else {
      check (arr, i, level + 1, sum + arr[i]);
    }
  }
}

[解决办法]

// 借用了2L的代码,按上面的思路小小的修改了下
// main里面加个Arrays.sort(a); 然后忽略了排序后有重复数据的情况。
   public static void calculate(int sum,int[] arr) {
        int count = 0;
        for (int i = 0; i <arr.length; i++) {
                    if(arr[i]>=0) break;
            for (int j = i+1; j <arr.length; j++) {
            if(arr[i]+arr[j]>=0){
            break;
            }
                for (int k = j+1; k <arr.length; k++) {
                    if (arr[i] + arr[j] + arr[k] == sum) {


                        count++;
                        System.out.println("第"+count+"组:"+arr[i]+"+"+arr[j]+"+"+arr[k]+"="+sum);
                        break;
                    }
                }
            }
        }
    }


[解决办法]
应该需要排序,而且这个应该有很多优化的空间。
不过可能会很复杂。我想到了那个可怕的kmp算法。

热点排行