在不使用任何无循环库的情况下检查给定的String是否为回文

时间:2018-09-16 13:51:25

标签: java algorithm

在一次采访中,我被要求编写代码来检查给定的字符串是回文还是回文,方法是在不使用库函数的情况下更改某些字符。这是我的方法

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个小时来编写代码。我可以成为开发人员吗?

3 个答案:

答案 0 :(得分:6)

标题说“无循环”,但是您需要检查所有符号对,因此使用递归(如您尝试过的)看起来很合理。但是您不检查和使用递归调用的结果。

伪代码可能看起来像(请注意,我们不需要更改源数据或提取子字符串):

编辑以提供更改一个字符的可能性

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

进行首次调用

答案 1 :(得分:2)

回答第一个问题。您必须使用递归来解决此问题。这是我的方法。

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;
}

您要问的第二个问题的答案肯定是您可以成为一名优秀的开发人员。 计算机编程是一种技巧。不是某种火箭科学。您必须通过精心制作来掌握它。

答案 2 :(得分:0)

使用递归函数

使用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;    
}