/ /配列とそのミラーの比較-Java、配列、ループ

配列とそのミラーの比較-Java、配列、ループ

さて、私は完全な配列を取り込む必要があるメソッドを持っています ints、それからミラーをチェックして、一致する最大のミラーが何であるかを確認します。たとえば、配列があります [7, 1, 2, 9, 7, 2, 1]、一致できる最大の配列は2です。 [1, 2].

今、私はそれを3つの方法に分けています。配列を受け入れるもの、配列を逆にしてそれを返すもの(mirrorArray)。そして3番目は一致する配列のサイズを数えています(groupCount)。ここに私がこれまでに持っているものがあります:

public int maxMirror(int[] nums) {
int[] revArray = mirrorArray(nums);

return groupCount(nums, revArray);
}

private int[] mirrorArray(int[] nums) {
int[] newArray = new int[nums.length];

for (int i = nums.length-1, j = 0; i >= 0; i--, j++) {
newArray[j] = nums[i];
}

return newArray;
}

private int groupCount(int[] aFor, int[] bRev) {
int maxCount = 0;
int groupSize = 1;

//get aFor value
for (int i = 0; i < aFor.length; i++) {
int[] tempA = Arrays.copyOfRange(aFor, 0, groupSize);

//loop through bRev and check for matches
for (int j = 0; j < bRev.length; j++) {
int[] tempB = Arrays.copyOfRange(bRev, j, j+groupSize);

if (Arrays.equals(tempA, tempB)) {
maxCount = tempA.length;
}
}

groupSize++;
}
return maxCount;
}

3番目の方法ではどこかで失敗し(2ではなく1を返す)、なぜ私がループを返して欲しいものを返すのか迷っています。どんな助けでも大歓迎です。

回答:

回答№1は5

よかった…

ここに問題があります:

int[] tempA = Arrays.copyOfRange(aFor, 0, groupSize);

常にtempBを長さの最初のsubArrayと比較しています groupSize のその行を

int[] tempA = Arrays.copyOfRange(aFor, i, i + groupSize);

それはうまくいくはずです。

EDIT 失敗のケースが来るのを待ってください。groupSizeの増分位置に問題があるようです。

   while (groupSize < aFor.length) {
//get aFor value
for (int i = 0; i < aFor.length; i++) {
int[] tempA = Arrays.copyOfRange(aFor, i, i + groupSize);

//loop through bRev and check for matches
for (int j = 0; j < bRev.length; j++) {
int[] tempB = Arrays.copyOfRange(bRev, j, j+groupSize);

if (Arrays.equals(tempA, tempB)) {
maxCount = groupSize;
}
}
}
groupSize++;
}

これは最も効率的ではありません。最適化するのは楽しい練習になるかもしれません。 1つの開始アプローチは、groupSizeを次の場所から開始することです。 aFor.length および減少。できるだけ早く maxCount 割り当てられている場合は、早期に戻ることができます。

編集2

 int groupSize = aFor.length;
while (groupSize >= 0) {
//get aFor value
for (int i = 0; i <= aFor.length - groupSize; i++) { // note this change
int[] tempA = Arrays.copyOfRange(aFor, i, i + groupSize);

//loop through bRev and check for matches
for (int j = 0; j <= bRev.length - groupSize; j++) { // note this change
int[] tempB = Arrays.copyOfRange(bRev, j, j+groupSize);

if (Arrays.equals(tempA, tempB)) {
return groupSize;
}
}
}
groupSize--;
}
return 1;
}

何が起こっていたのは、その配列です。copyOfRangeは、境界値をゼロで埋めていました。また、前述の早期終了オプションも追加しました。おそらくもっと多くの最適化が可能です


回答№2については2

間の論理 tempA そして tempB 問題がある:

最初のループ(元の)の各反復で、値の0-> groupSizeセットを選択し、逆配列のすべての類似サイズのシーケンスと正確に比較します。したがって、最初の反復は

Orignal array (aFor) : [7, 1, 2, 9, 7, 2, 1]
Reverse array (bRev) : [1, 2, 7, 9, 2, 1, 7]
Iteration-1:
tempA=> [7]
tempB=> [1],[2],[7]...
maxCount = 1; (in first iteration, multiple single value matche)

Iteration-2:
tempA=> [7,1]
tempB=> [1,2],[2,7]...
maxCount = 1; (no match of [7,1], maxCount continues from first iteration)

同様に、他のすべての反復では、入力データセットが原因でシーケンスの一致は見つかりません。

入力を[7、1、2、9、9、7、1、7]に変更すると、 maxCountは2

入力[7、1、2、9、2、1、7]の場合、 maxCountは7

しかし、それは入力の性質とコードの問題によるものです。

コードの問題は外側のループ(aFor ループ)シーケンスごとに評価されませんつまり、反復2では、サイズ2の最初のセット([7,1])のみをチェックし、それ以降のセット([1,2]、[2,9] ..)は比較されないため、常にmaxCount = 1を取得します。前の試合に。


回答№3の場合は1

これは質問とは無関係に思えるかもしれませんが、新しい配列を作成せずにテストを試みました(インプレース比較)。これが役立つことを願っています。

public static int getMaxMirrorSub(int[] arr) {
for (int eqLength = arr.length; eqLength >= 0; eqLength--) {
for (int arrayStart = 0; arrayStart < arr.length; arrayStart++) {
for (int mirrorStart = arr.length - 1; mirrorStart >= eqLength - 1; mirrorStart--) {
int indexArray = arrayStart, indexMirror = mirrorStart;
while(indexArray < arr.length
&& indexMirror >= 0
&& arr[indexArray] == arr[indexMirror]){

indexArray++; indexMirror--;
}

if (indexArray - arrayStart == eqLength)
return eqLength;
}
}
}
return 0;
}

回答№4の場合は0
public int maxMirror(int[] nums) {
int[] reverse = null;
int max = 0;
for(int i = 0; i < nums.length; i++) {
for(int k = 0; k < nums.length; k++) {
if(i > k) {
} else {
reverse = reverseSection(nums, i, k);
if(searchFor(reverse, nums)) {
if(reverse.length > max) { max = reverse.length; }
}
}
}
}

return max;
}

public int[] reverseSection(int[] nums, int begin, int end) {
int[] nArray = new int[end - begin + 1];
int numbs = end - begin;
for(int i = begin; i <= end; i++) {
nArray[numbs] = nums[i];
numbs--;
}
return nArray;
}

public boolean searchFor(int[] reverse, int[] nums) {
int index = 0;
boolean check = false;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == reverse[index]) {
index++;

if(index >= reverse.length) {
return true;
}
} else {
index = 0;
}
}
return false;
}