最近、上記の質問があったインタビューコードのチャレンジに直面しました。彼の森を持っている男がいて、そこでは木が列形式で植えられています。各行には、視覚的に美しく快適な方法で木を含める必要があります。例えば。上記の画像に示すように:
上の木のパターンは、視覚的に美的に楽しいものになることは決してありません:
ここで、各列は行のツリーとその高さを表します。並木を視覚的に快適にするために、他の2本の木が同じ高さであってはなりません。農場の所有者は、すべての木が視覚的に美的であることを望んでいます。そしてそのために、彼は多くても一本の木を切ることができます。木の行を美しくするために、1本の木を連続してカットする方法の数を見つけます。
一部の行が既に視覚的に美しく快適である場合でも、関数の出力として0を返します。
木を切った後でも、列が視覚的に審美的なパターンに形成されない可能性がある場合。その後、関数は-1を返します。
例:A [] = {3、4、5、3、7};次に、3つの方法で視覚的に美的にすることができます。3、A [] = {4、5、3、7}を削除し、それ以外は4、A [] = {3、5、3、7}を削除し、それ以外は5、A [を削除します] = {3、4、3、7}なので、関数は3を返す必要があります。
g。 B [] = {1、2、3、4、2、5};このパターンは視覚的に美的であると決して言えないので、関数は-1を返します。
例えば。 c [] = {1、3、1、2};このパターンはすでに視覚的に美的に快適なので、0を返すはずです。
次の解決策の部分に示すように、私はそれを解決しようとしました。誰かが問題を解決してコードの複雑さを減らし、Javaを使用してより速く作業するためのより良い方法を提案してくれませんか?私が作成したこのような長い解決策よりも、この問題の解決策を数分以内に簡単に解決できるデータ構造の概念はありますか?
最近のインタビューでも同じ質問を受けました。これが再帰関数アプローチを使用した私の解決策です:
public class aestheticalPresentPattern {
public static void main(String[] args) {
int[] array = {3, 4, 5, 3, 7};
int[] array2 = {1, 2, 3, 4, 2, 5};
int[] array3 = {1, 3, 1, 2};
System.out.println(possibleAetheticCount(array));
System.out.println(possibleAetheticCount(array2));
System.out.println(possibleAetheticCount(array3));
}
private static int possibleAetheticCount(int[] array){
int count =0;
if(isAethetical(array,0,0)) {
return count;
}
for(int i=0;i<array.length;i++){
int newArray[] = returnNewArray(array,i);
if(isAethetical(newArray,0,0)){
count++;
}
}
return count>0?count:-1;
}
private static int[] returnNewArray(int[] array, int pos){
int newArray[] = new int[array.length-1];
int j=0;
for(int i=0;i<array.length;i++){
if(pos!=i){
newArray[j] =array[i];
j++;
}
}
return newArray;
}
private static boolean isAethetical(int[] array, int pos, int previousStep) {
int nextpos = pos + 1;
if (nextpos >= array.length) {
return true;
}
int currentStep;
if (array[nextpos] > array[pos]) {
currentStep = 1;
} else if (array[nextpos] < array[pos]) {
currentStep = -1;
} else {
currentStep = 0;
}
if (previousStep == currentStep)
return false;
return
isAethetical(array, nextpos, currentStep);
}
}
最近、私は最新のインタビューからこの質問を受けました。以下は、行数を減らした最善の方法です。
import Java.util.*;
class Solution {
static int isAesthetic(List<Integer> lists){
if (lists.get(0) < lists.get(1)){
for (int i=1;i<lists.size() - 1;i+=2){
if (lists.get(i-1) < lists.get(i) && lists.get(i) > lists.get(i+1)) {}
else return 0;
}
} else {
for (int i=1;i<lists.size() - 1;i+=2){
if (lists.get(i-1) > lists.get(i) && lists.get(i) < lists.get(i+1)) {}
else return 0;
}
}
return 1;
}
static int solution(int A[]){
int count = -1;
List<Integer> lists = new ArrayList<>();
for (int i=0;i<A.length;i++) lists.add(A[i]);
count += isAesthetic(lists);
if (count == 0) return 1;
count = 0;
for (int i=0;i<A.length;i++){
lists.remove(i);
count += isAesthetic(lists);
lists.add(i, A[i]);
}
return count;
}
public static void main(String[] args) {
int A[] = {3,4,5,3,7};
int ways = solution(A);
System.out.println(ways);
}
}
最短の方法は、違いを見つけて確認することです
import Java.util.ArrayList;
import Java.util.List;
public class Test11 {
public static void main(String[] args) {
int [] arr = {5 ,4 ,3, 2 , 1 ,6};
List<Integer> list = new ArrayList<>();
List<Integer> correctedList1 = new ArrayList<>();
List<Integer> correctedList2 = new ArrayList<>();
for(int i = 0 ; i < arr.length -1 ; i++){
list.add(arr[i] - arr[i+1]);
if(i%2 == 0){
correctedList1.add(-1);
correctedList2.add(1);
}else {
correctedList1.add(1);
correctedList2.add(-1);
}
}
int modify1 = 0;
int modify2 =0;
int countZero = 0;
for(int i =0 ; i < list.size() ; i++){
if(!((list.get(i)>0 && correctedList1.get(i)>0) || (list.get(i)<0 && correctedList1.get(i)<0))){
modify1++;
}
if(!((list.get(i)>0 && correctedList2.get(i)>0) || (list.get(i)<0 && correctedList2.get(i)<0))){
modify2++;
}
if(list.get(i) == 0){
countZero++;
}
}
if(countZero > 0){
System.out.println(Math.min(modify1,modify2) - (countZero/2));
} else {
System.out.println(Math.min(modify1,modify2));
}
}
}
コンパクトJava 11ソリューション
public class Solution {
public int solution(int[] A) {
if (isAesthetic(A)) return 0;
int possibleCuts = 0;
for (int i = 0; i < A.length; i++) {
int[] copyA = copyWithOneCut(A, i);
if (isAesthetic(copyA)) {
possibleCuts++;
}
}
return possibleCuts == 0 ? -1 : possibleCuts;
}
private boolean isAesthetic(int[] array) {
for (int i = 1; i < array.length - 1; i++) {
var a = array[i - 1];
var b = array[i];
var c = array[i + 1];
if (!(a < b && b > c) && !(a > b && b < c)) {
return false;
}
}
return true;
}
private int[] copyWithOneCut(int[] array, int index) {
int[] copyArray = new int[array.length - 1];
System.arraycopy(array, 0, copyArray, 0, index);
System.arraycopy(array, index + 1, copyArray, index, array.length - index - 1);
return copyArray;
}
}