時間前に、私は別の配列への溶液を入れ、配列によって表される2つの整数を合計するインタビューの中で頼まれました。私は効率的なソリューションを提供するために面接のアイデアの一部でした。それ以来、私は、この問題に対する簡単で効率的な解決策を探している、と私はまだどれも見つけませんでした。
だから私は、コミュニティと私の解決策を共有し、あなたがたのうち、効率を向上させるために役立つことができればお願いしたいと思います。MNは、mおよびnは、合計に対する各整数配列の大きさを表す最大のmのアレイまたはNと、の大きさであるO(MN)のようなこれは、例えば、ルックス。それは線形時間で動作しているかのようにこのようにして、それが見えます。
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[] {});
}
}
問題や、ここでのトリックはないリニアタイムの仕事はVectorクラスは、新しい要素を挿入し、解の配列のサイズを変更することによって行われるということです。この方法では、溶液は線形時間で動作していません。それは、Vectorクラスせずに同様のソリューションを作成することは可能ですか?
また、このコードの動作テストしたバージョンを見ることができますhttps://github.com/lalounam/rudiments
SSPは、コメントで述べたように、あなたが作成する必要がありArrayList
、初期の容量を持ちますMath.max(m.length, n.length) + 1
。それは和の最大桁数です。
int arrayCapacity = Math.max(m.length, n.length) + 1;
final List<Integer> solution = new ArrayList<>(arrayCapacity);
そして、あなたは0で、これを埋めるために必要があります。
for (int i = 0 ; i < arrayCapacity ; i++) {
solution.add(0);
}
ここでは「トリック」です。ループのメインでは、あなたは端からそれを埋める、最初から配列を記入しません。代わりのinsertElementAt
開始、あなたset
ので、我々は、反復で、プラス1されているものは何でもしたインデックスにある要素solution
のよりも長い長い1であるm
とn
。
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[] {});
}