さて、私は完全な配列を取り込む必要があるメソッドを持っています 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;
}