項(xiàng)目中我們會(huì)遇到需要將數(shù)組元素逆序輸出的情形哼蛆,可以有好幾種方法完成這個(gè)需求:
1怒医、方法一:逆序遍歷數(shù)組元素并將元素放入新數(shù)組岭埠,分析時(shí)間復(fù)雜度是O(n),空間復(fù)雜度是o(n)
for(Integer i = sqList.size() - 1; i >= 0; i --) {
reversedArray.add(sqList.get(i));
}
2裹刮、方法二:掃描數(shù)組元素的前半部分元素音榜,將元素sqListi與其余后半部分對(duì)應(yīng)的元素sqList[sqList.length - i - 1]進(jìn)行交換,時(shí)間復(fù)雜度為O(n/2),不需要額外的空間
private static <T> void reverse(List<T> sqList) {
if (sqList == null || sqList.size() < 1) {
return;
}
T temp = null;
Integer size = sqList.size();
for (Integer j = 0; j < size >> 1; j++) {
temp = sqList.get(j);
sqList.set(j, sqList.get(size - j - 1));
sqList.set(sqList.size() - j - 1, temp);
}
}
3、方法三:Collections.reverse(sqList)捧弃,jdk內(nèi)部源碼實(shí)現(xiàn)如下赠叼,可以看到j(luò)dk源碼的實(shí)現(xiàn)方式和方法二的思想是一致的,都是交換相應(yīng)位置上的元素违霞。所以Java中若數(shù)組元素逆序直接調(diào)用Collections.reverse方法即可嘴办。
public static void reverse(List<?> list) {
int size = list.size();
if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
swap(list, i, j);
} else {
// instead of using a raw type here, it's possible to capture
// the wildcard but it will require a call to a supplementary
// private method
ListIterator fwd = list.listIterator();
ListIterator rev = list.listIterator(size);
for (int i=0, mid=list.size()>>1; i<mid; i++) {
Object tmp = fwd.next();
fwd.set(rev.previous());
rev.set(tmp);
}
}
}
4、方法四:將數(shù)組元素使用某一字符买鸽,如-涧郊,Join得到一個(gè)字符串,使用StringBuffer的reverse方法后再講字符串以-分割得到數(shù)組即可癞谒。
public static String[] reverse(String[] array ){
String str = String.join("-", array);
StringBuffer buffer = new StringBuffer(str);
String reverseStr = buffer.reverse().toString();
String[] resultArray = reverseStr.split("-");
return resultArray;
}