2

以下のコードを書いて、配列に合計の原因となる 2 つの数値があるかどうかを確認しました。その合計に寄与する要素をキャプチャする方法がわかりません。何かご意見は

例 = {1,11,4,7,8,10} 合計 = 21 カウント = 2

このコードは true または false を返しますが、合計に寄与する数値をキャプチャしません。どうやってやるの?

public static boolean isSum(int[] a,int val,int count,int index){
    if(count == 0 && val ==0){
        return true;
    }
    if(index>=a.length)
        return false;
    else{
        return isSum(a,val-a[index],count-1,index+1)||isSum(a,val,count,index+1);
    }
}

以下にリストされているすべての美しいソリューションに感謝します。午前中ハッキングしていて、合計を説明できる任意の数の要素についてこの問題を解決するエレガントな方法を見つけました。コメントのためにここでソリューションを共有したかっただけです

public class IsSum {

static ArrayList<Integer> intArray;

public static void main(String[] args) {
    // TODO code application logic here
    int[] a = {1,44, 4, 7, 8, 10};
    intArray = new ArrayList<Integer>();
    if (isSum(a,54,2, 0)) {
        System.out.println("Is Present");
    }
    Iterator<Integer> arrayIter = intArray.iterator();
    while (arrayIter.hasNext()) {
        System.out.println(arrayIter.next());
    }
}

public static boolean isSum(int[] a, int val, int count, int index) {
    if (count == 0 && val == 0) {
        return true;
    }

    if (index >= a.length) {
        return false;
    } else {
        if (isSum(a, val - a[index], count - 1, index + 1)) {
            intArray.add(a[index]);
            return true;
        } else {
            return isSum(a, val, count, index + 1);
        }
    }
}

}

4

4 に答える 4

1

パッチは少し醜いですが、そのような 2 つの要素がある場合は機能します。結果は、配列内のこれらの要素のインデックスを返します。

public static int[] isSum(int[] a,int val,int count,int index, int[] arr){
    int[] res = new int[2];
    if(count == 0 && val ==0){
        return arr;
    }
    else if(index >=a.length || count == 0) {
        return res;
    }
    else{
        res[0] = arr[0];
        res[1] = arr[1];
        if(count==1){
            arr[1] = index;
        }
        else{
            arr[0] = index;
        }
        int[] s1 = isSum(a,val-a[index],count-1,index+1, arr);
        int[] s2 = isSum(a,val,count,index+1, res);
        res = (s1[1] != 0 ? s1 : s2);
    }
    return res;
}

public static void main(String...args){
    int[] a = {1,11,4,7,8,10};
    int[] s = new int[2];
    int [] res = isSum(a, 21, 2, 0, s);
    System.out.println("result: "+(res[1] != 0));
    if((res[1] > 0)){
        System.out.print(res[0]+" "+res[1]);
    }
}

出力

result: true
1 5

別の(そしてよりエレガントな)方法:

public static int[] isSum(int[] a,int val){
    int[] res = new int[2];
    for(int i=0; i<a.length; i++){
        int tmp = a[i];
        int index = search(a, val-tmp);
        if(index != -1){
            return new int[] {i, index};//success
        }
    }
    return res;//failure
}

private static int search(int[] a, int val) {
    for(int i=0; i<a.length; i++){
        if (a[i] == val) return i;
    }
    return -1;
}

public static void main(String...args){
    int[] arr = {1,2,3,11,4,7,10};
    int[] res = isSum(arr, 21);
    System.out.println("res: {"+res[0]+","+res[1]+"}");
}

出力

解像度: {3,6}

于 2013-08-21T04:07:00.393 に答える
0
public static boolean isSum(int[] arr,int val){
   int a,b=0;
   int c=0,d=0;
   boolean bol=false;
   for(a=0;a<arr.length;a++)
   {
       b=a+1;

   while(b<arr.length)
   {

       System.out.println(a+" "+b);

   if(arr[a]+arr[b]==val)
   {
       System.out.println(arr[a]+arr[b]);
   bol=true;
   c=a;
   d=b;
   break;
   }
   else
       b++;

   }

   }
   System.err.println(c+" "+d);
       return bol ;
    }
}
于 2013-08-21T06:34:21.337 に答える
0

戻り値の型を(たとえば)配列に変更する必要があります。次に、返された結果を直接返さずにキャッチする必要があります。trueの場合は、指定されたインデックスで値をキャプチャしてから配列で返し、falseの場合は戻りますnull配列...返された配列の値をテストすると、それがtrueかfalseかがわかります。また、trueの場合は必要な値が得られます。

アップデート:

public static int[] isSum(int[] a, int val, int count, int index) {
int[] results = new int[2];
results[0] = -1;
results[1] = -1;

if (count == 0 && val == 0) {
    results[0] = 0;
    results[1] = 0;
    return results;
}
if (index >= a.length)
    return results;
else {

    if (isSum(a, val - a[index], count - 1, index + 1) == results) {
        if (isSum(a, val, count, index + 1) == results) {
            return results;
        } else {
            results[0] = val;
            results[1] = a[index + 1];
            return results;
        }
    } else {
        results[0] = val - a[index];
        results[1] = a[index + 1];
        return results;
    }

}
}
于 2013-08-21T04:45:15.180 に答える