クリスチャン・デ・Lorence:
私は与えられた文字列が回文であるかのライブラリ関数を使用せずに、いくつかの文字を変更することによって回文ことができるかどうかを確認するために、書き込みコードへのインタビューで聞かれました。ここに私のアプローチであります
import java.util.Scanner;
public class Palindrom {
static int temp=0;
static char[] cArr;
static boolean chackPotentialPalindrom(char[] cAr){
cArr=cAr;
if(cArr!=null){
char current=cArr[0];
for(int i=1;i<cArr.length;i++){
if(current==cArr[i]){
cArr=removeElement(i);
chackPotentialPalindrom(cArr);
break;
}
}
if(cAr.length==2){
if(cAr[0]==cAr[1]){
cArr=null;
}}
if(temp==0 && cArr!=null){
temp=1;
cArr=removeFirstElement(cArr);
chackPotentialPalindrom(cArr);
}
}
if(cArr==null){
return true;
}else{
return false;
}
}
static char[] removeFirstElement(char[] cAr){
cArr=cAr;
if(cArr!=null){
if(cArr.length >1){
char[] cArrnew=new char[cArr.length-1];
for(int j=1,k=0;j<cArr.length;j++,k++){
cArrnew[k]=cArr[j];
}
return cArrnew;
} else {
return null;
}
} else {
return null;
}
}
static char[] removeElement(int i){
if(cArr.length>2){
char[] cArrnew=new char[cArr.length-2];
for(int j=1,k=0;j<cArr.length;j++,k++){
if(i!=j){
cArrnew[k]=cArr[j];
}else{
k-=1;
}
}
return cArrnew;}
else{
return null;
}
}
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
while(true){
temp=0;
String s=scn.next();
char[] arr=s.toCharArray();
System.out.println(chackPotentialPalindrom(arr));
}
}
}
彼らはこれを書くために私のために3時間を要したcode.Itにペンと紙を与えているとして、このコードを最適化するための任意のヒントは?私はインタビューでこれを書くことができませんでした。私は、開発者になることができますか?
MBO:
タイトルは「ループなし」と言いますが、あなたがしようとしているとして、再帰を使用して、すべてのシンボルのペアをチェックする必要があり、合理的に見えます。しかし、あなたは再帰呼び出しの結果を確認し、使用しないでください。
擬似コードは、(我々は変更ソースデータまたは抽出したサブストリングにする必要はありません)のようになります。
編集は、 ALTER 1つの文字への可能性を提供するために
boolean checkPotentialPalindrom(char[] cAr, start, end, altcnt){
if (end <= start)
return true
if (cAr[start] != cAr[end])
altcnt = altcnt + 1
if (altcnt > 1)
return false
return checkPotentialPalindrom(cAr, start + 1, end - 1, altcnt)
}
そして、引数を持つ最初の呼び出しを行います 0, len(cAr-1), 0