![](/img/trans.png)
[英]Checking whether an int is palindrome or not without converting into a string?
[英]Check whether a given String is palindrome or not without using any library without loop
在一次采訪中,我被要求編寫代碼來檢查給定的字符串是回文還是可以通過在不使用庫函數的情況下更改某些字符來成為回文。 這是我的方法
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 個小時來寫這個。 我可以成為開發人員嗎?
標題說“沒有循環”,但您需要檢查所有符號對,因此正如您所嘗試的那樣,使用遞歸看起來很合理。 但是您不會檢查和使用遞歸調用的結果。
偽代碼可能看起來像(注意我們不需要更改源數據或提取子字符串):
編輯以提供更改一個字符的可能性
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
進行第一次調用
回答你的第一個問題..你必須使用遞歸來解決這個問題。 這是我的方法。
public boolean isPalindrom(char[] str, int start, int end) {
if (end <= start)
return true;
if (str[start] != str[end] || arraySize(str) <= 1)
return false;
return isPalindrom(str, start + 1, end - 1);
}
public int arraySize(char[] str) {
int count = 0;
for (char i : str) {
count++;
}
return count;
}
您已嘗試使用循環來實現此算法,您可以像這樣簡化它
public boolean isPalindroms(char[] str) {
int diffCount = 0;
int left = 0;
int right = arraySize(str) - 1;
while (right > left) {
if (str[right--] != str[left++]) {
diffCount++;
}
}
return (diffCount < 2);
}
public int arraySize(char[] str) {
int count = 0;
for (char i : str) {
count++;
}
return count;
}
您提出的第二個問題的答案肯定是您可以成為一名優秀的開發人員。 計算機編程是一門手藝。 不是某種火箭科學。 你必須通過制作它來掌握它。
使用遞歸函數
用left=0 and right = arr.length-1
調用
public static boolean isPalindrom(char[] arr, int left, int right){
if(arr[left++] != arr[right--])
return false;
if(left < right)
isPalindromss(arr, left++, right--);
return true;
}
如果你必須使用 while 循環,你可以像下面這樣簡化它
public boolean isPalindrom(char[] arr){
int left=0;
int right = arr.length-1;
while(left < right){
if(arr[left++] == arr[right--])
continue;
return false;
}
return true;
}
使用StringBuilder
,我們可以做到
public static boolean isPalindrom(String str, int len){
StringBuilder sb= new StringBuilder(str);
if((len > 1) & !(sb.substring(0,len/2 + 1).equals(sb.reverse().substring(0,len/2 + 1))))
return false;
return true;
}
function palin(input, leftIdx = 0, rightIdx = input.length - 1) { if (leftIdx >= rightIdx) return true; if (input[leftIdx] != input[rightIdx]) return false; return palin(input, leftIdx + 1, rightIdx - 1); } const testCases = { air: false, airia: true, caria: false, a: true, bb: true, bcdb: false, zzaaaaz: false, }; Object.keys(testCases).forEach(test => console.log("Test: ", test, " is palindrome: ", palin(test), testCases[test]) );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.