我必須使用遞回在java中創建一個方法(int [] v,int a,int b),該方法接受一個整數陣列并回傳一個陣列,其中陣列的每兩個元素之間必須有值a或值b、交替。
例如,如果一個陣列 v = {1,5,6,8},當我呼叫這樣的方法 (v,0,1) 時,該方法應該回傳 {1,0,5,1,6,0,8 }。
任何型別的偽代碼都會有所幫助,我真的很難實作這一點。謝謝!
uj5u.com熱心網友回復:
讓我知道它是否滿足您的需求
yourMethod(int[] v, int a, int b){
int[] newArray = new int[v.length*2-1];
int counter = 0;
boolean alter = true;
for(int i=0; i<newArray.length; i ){
if(i%2==0){
newArray[i] = v[counter];
counter ;
}else{
if(alter){
newArray[i] = a;
alter = !alter;
}else{
newArray[i] = b;
alter = !alter;
}
}
}
}
uj5u.com熱心網友回復:
首先,我們需要一種連接陣列的方法,因為它們不能在 Java 中調整大小:
int[] concat(int[] p, int[] q) {
int[] result = new int[p.length q.length];
System.arraycopy(p, 0, result, 0, p.length);
System.arraycopy(q, 0, result, p.length, q.length);
return result;
}
然后,我們需要一個遞回定義:
- 基本情況:如果陣列的長度不是至少為 2,則只回傳該陣列。
- 遞回案例:回傳第一個元素的陣列的串聯,并將
a應用于陣列尾部(從第二個元素開始)的方法與a交換b。
交換值為我們提供了所需的值之間的交替。
int[] inject(int[] v, int a, int b) {
if (v.length < 2) return v;
return concat(new int[] {v[0], a},
inject(Arrays.copyOfRange(v, 1, v.length), b, a));
}
Arrays.copyOfRange為我們提供了一種方便的方法來創建一個陣列,它只是當前陣列的“尾部”。呼叫它:
inject(new int[] {1, 5, 6, 8}, 0, 1));
回傳預期:
{1, 0, 5, 1, 6, 0, 8}
您可以使用幾個輔助方法使其更清晰:
int[] tail(int[] v) {
return Arrays.copyOfRange(v, 1, v.length);
}
int[] arrayOf(int... ints) {
return ints;
}
那么遞回方法就變成了:
int[] inject(int[] v, int a, int b) {
if (v.length < 2) return v;
return concat(arrayOf(v[0], a), inject(tail(v), b, a));
}
uj5u.com熱心網友回復:
這是另一種方法。它使用了一個輔助方法,除了原始引數之外,它還接收結果的目標陣列和表示我們當前從源陣列復制的值的索引:
import java.util.*;
class Main {
public static void main(String[] args) {
int[] v = {1,5,6,8};
int[] w = arrAltExpand(v, 0, 1);
System.out.println(Arrays.toString(v));
System.out.println(Arrays.toString(w));
}
public static int[] arrAltExpand(int[] arr, int a, int b) {
if (arr == null || arr.length == 0) {
return new int[] {};
}
int[] retArr = new int[2 * arr.length - 1];
arrAltExpandHelper(arr, a, b, retArr, 0);
return retArr;
}
private static void arrAltExpandHelper(int[] arr, int a, int b, int[] retArr, int index) {
if (index < arr.length) {
retArr[2 * index] = arr[index];
if (index < (arr.length - 1)) {
retArr[2 * index 1] = (index % 2 == 0) ? a : b;
}
arrAltExpandHelper(arr, a, b, retArr, index 1);
}
}
}
輸出:
[1, 5, 6, 8]
[1, 0, 5, 1, 6, 0, 8]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449668.html
