Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地将两个数组表示的两个整数相加,将解放入另一个数组中_Java - Fatal编程技术网

Java 如何有效地将两个数组表示的两个整数相加,将解放入另一个数组中

Java 如何有效地将两个数组表示的两个整数相加,将解放入另一个数组中,java,Java,很久以前,在一次采访中,我被要求对数组表示的两个整数求和,将解放入另一个数组中。面试的部分想法是为我提供一个有效的解决方案。从那时起,我一直在寻找一个简单而有效的解决方案来解决这个问题,但我还没有找到 因此,我想与社区分享我的解决方案,并询问你们中是否有人可以帮助提高效率。此示例类似于O(mn),其中mn是m或n之间的最大数组的大小,其中m和n表示要求和的每个整数数组的大小。因此,它看起来好像是在线性时间工作 public class ArrayRudiments { /**

很久以前,在一次采访中,我被要求对数组表示的两个整数求和,将解放入另一个数组中。面试的部分想法是为我提供一个有效的解决方案。从那时起,我一直在寻找一个简单而有效的解决方案来解决这个问题,但我还没有找到

因此,我想与社区分享我的解决方案,并询问你们中是否有人可以帮助提高效率。此示例类似于O(mn),其中mn是m或n之间的最大数组的大小,其中m和n表示要求和的每个整数数组的大小。因此,它看起来好像是在线性时间工作

public class ArrayRudiments {

    /**
     * Add two integers represented by two arrays
     * 
     * NOTE: Integer as a natural number, not as a programming language data type.
     * Thus, the integer can be as big as the array permits.
     * 
     * @param m first number as array
     * @param n second number as array
     * @return integer sum solution as array
     */
    public Integer[] sum(Integer m[], Integer n[]) {
        int carry = 0, csum = 0;
        final Vector<Integer> solution = new Vector<Integer>();

        for (int msize = m.length - 1, nsize = n.length - 1; msize >= 0 || nsize >= 0; msize--, nsize--) {

            csum = (msize < 0 ? 0 : m[msize]) + (nsize < 0 ? 0 : n[nsize]) + carry;
            carry = csum / 10;

            solution.insertElementAt(csum % 10, 0);
        }

        if (carry > 0) {
            solution.insertElementAt(carry, 0);
        }

        return solution.toArray(new Integer[] {});
    }

}
公共类数组审核{
/**
*添加由两个数组表示的两个整数
* 
*注意:整数是自然数,而不是编程语言数据类型。
*因此,整数可以是数组允许的最大值。
* 
*@param m m第一个数字作为数组
*@param n第二个数字作为数组
*@返回整数和解作为数组
*/
公共整数[]和(整数m[],整数n[]{
int进位=0,csum=0;
最终向量解=新向量();
对于(int-msize=m.length-1,nsize=n.length-1;msize>=0 | | nsize>=0;msize--,nsize--){
csum=(msize<0?0:m[msize])+(nsize<0?0:n[nsize])+进位;
进位=csum/10;
溶液。插入剂(csum%10,0);
}
如果(进位>0){
溶液。插入物(进位,0);
}
返回解.toArray(新整数[]{});
}
}
这里的问题或技巧是,非线性时间作业是通过向量类插入新元素并调整解数组的大小来执行的。这样,解决方案就不会在线性时间内工作。有没有可能在没有向量类的情况下创建类似的解决方案


您还可以在

中看到该代码的工作测试版本,正如SSP在评论中所说,您应该创建一个初始容量为
Math.max(m.length,n.length)+1的
ArrayList
。这是总和的最大位数

int arrayCapacity = Math.max(m.length, n.length) + 1;
final List<Integer> solution = new ArrayList<>(arrayCapacity);
这基本上是“从后面”填充列表

最后,按如下方式调整列表的大小:

if (carry > 0) {
    solution.set(0, carry);
    return solution.toArray(new Integer[] {});
} else {
    return solution.subList(1, solution.size()).toArray(new Integer[] {});
}

创建具有预定义长度的arraylist。对于长度,选择最大数组大小。将结果存储在该列表中。是的,但这与创建一个初始容量为最大数组大小的向量相同,然后,如果总和创建任何进位,则只需调整原始数组一次大小。但是,每次插入都会将旧的数字移动到解决方案中,增加了计算的复杂性。@Eduardo向后插入数字,然后在末尾反转向量。或者使用一种在开始时支持高效插入的数据结构,如
ArrayDesk
。在
solution.set(Math.max(msize, nsize) + 1, csum % 10);
if (carry > 0) {
    solution.set(0, carry);
    return solution.toArray(new Integer[] {});
} else {
    return solution.subList(1, solution.size()).toArray(new Integer[] {});
}