3 回答

TA貢獻(xiàn)1789條經(jīng)驗 獲得超8個贊
如果答案要求您自己進(jìn)行循環(huán),那么這樣的事情應(yīng)該可以正常工作(執(zhí)行此操作的幾種方法之一,但是是O(n)):
public void addBefore(int x) {
if(length + 1 >= a.length){
int[] b = new int[a.length*2];
b[0] = x;
for (int i = 0; i < length; i++) {
b[i + 1] = a[i];
}
a = b;
} else {
for (int i = length; i >= 0 ; i--) {
a[i + 1] = a[i];
}
a[0] = x;
}
length++;
}
我注意到這開始運(yùn)行“速度測試” - 不確定這樣的測試有多有用,因為它將基于 cpu 性能,而不是測試算法的復(fù)雜性..

TA貢獻(xiàn)1806條經(jīng)驗 獲得超5個贊
無論您是先添加還是最后添加,只有在數(shù)組已滿時才需要增加數(shù)組大小。
該count字段似乎與 完全相同length,并且index作為一個字段似乎未使用且無意義,因此將它們都刪除。
要重新排列數(shù)組中的值,請使用以下方法:
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
你的兩個“添加”方法應(yīng)該是:
public class IntArrayList {
private int[] a; // Underlying array
private int length; // Number of added elements in a
// other code
public void add(int x) {
if (length == a.length) {
int[] b = new int[a.length * 2];
System.arraycopy(a, 0, b, 0, length);
a = b;
}
a[length++] = x;
}
public void addBefore(int x) {
if (length < a.length) {
System.arraycopy(a, 0, a, 1, length);
} else {
int[] b = new int[a.length * 2];
System.arraycopy(a, 0, b, 1, length);
a = b;
}
a[0] = x;
length++;
}
}

TA貢獻(xiàn)1856條經(jīng)驗 獲得超5個贊
您的解決方案存在三個問題:
您增加了
a
每次調(diào)用該方法的長度。這將很快創(chuàng)建一個OutOfMemoryException
當(dāng)你從
a
to復(fù)制值時b
,你做了b[i+a.length] = a[i];
這意味著這些值將被復(fù)制到中間b
而不是只移動一個位置最后,您將新值放在數(shù)組的末尾而不是開頭。
我之所以能看到這一切,是因為我在您的代碼上使用了調(diào)試器。如果您希望能夠檢測和修復(fù)代碼中的問題,則需要開始使用此工具。
所以固定的解決方案會這樣做:
檢查是否
a
已滿(就像使用add()
方法完成一樣),如果是,則創(chuàng)建b
并將所有內(nèi)容復(fù)制到其中,依此類推)將所有值前移一位。最簡單的方法是從長度向后循環(huán)到
0
在數(shù)組的開頭分配新值
這是一個可行的解決方案:
public void addBefore(int x) {
// increase length if a is full
if (length >= a.length) {
int[] b = new int[a.length * 2];
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
a = b;
}
// shift all values one cell ahead
for (int i = length; i > 0; i--) {
a[i] = a[i-1];
}
// add new value as first cell
a[0] = x;
length ++;
}
}
添加回答
舉報