(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/73927815冷血之心的博客)
题目一:
大家对回文串不陌生吧?一个字符串从前看和从后看如果一样的话,就是回文串。比如“上海自来水来自海上”就是一个回文串。现在我们的问题来了,把一个数字看成字符串,问它是不是一个回文数?这么简单的题目对想要成为小米工程师的你来说肯定不是问题。不过提醒一下哦:时间复杂度和空间复杂度越低的算法,得分越高。
常规解法:
(1)大多数人想到的肯定是现将数字转换为字符串,然后首尾进行判断比较,得出是否是回文串。
代码如下:
public boolean isPalindromeNumber(long num){
String str = num + "";
int start = 0;
int end = str.length() - 1;
while(start <= end){
char s = str.charAt(start);
char e = str.charAt(end);
if(s != e){
return false;
}else{
start++;
end--;
}
}
return true;
}
高效解法:
本题在时间复杂度和空间复杂度上有所要求,所有采用将数字转换成字符串,在空间复杂度显然有点不划算,通过计算得到数字前后对应位的数字,显然要好一些(需要深厚的数学功底)
public static boolean isPalindromeNumber(long num){
int a = (int) num;
int h = 1; // h要保持和剩余的数字一样的位数
if (a < 0)
return false;
while (a / h >= 10) {
h = h * 10;
}
while (a > 0) {
if (a / h != a % 10) // a/h可以得出首位数字; a%10则可以得出末位数字
return false;
a = a % h; // 去除首位数字
a = a / 10; // 去除末位数字
h = h / 100;
}
return true;
}
题目二:
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。
思路:本题使用暴力破解法,时间复杂度为O(N的立方),我们先看一种使用动态规划,使得时间复杂度降为了O(N的平方)的算法。
动态规划:分解成小问题,并且使用额外的辅助空间来完成最最优解的保存。
public int getLongestPalindrome(String s, int n) {
// write code here
if(s==null||n<=0){
return 0;
}
// 字符串长度为1,则其是回文串
if(n==1){
return 1;
}
// 动态规划中,用于保存最长回文串的值,比如pair[0][1]表示从0-1的回文串长度,数组值为0表示不是回文串
int[][] pair = new int[n][n];
int max=0; // 需要维护的max变量
for(int i=0;i0
if(s.charAt(i)==s.charAt(j)&&(i-j<2||pair[j+1][i-1]>0)){
pair[j][i]=i-j+1;
// 判断是否需要更新max变量
if(pair[j][i]>max){
max=pair[j][i];
}
}
}
}
return max;
}
LeetCode原题:需要的不是最长的回文串长度,而是让你输出最长的回文串,则我们在更新max变量的时候,必须一并将其pair数组的两个下标保存,最后根据start和end变量来截取原字符串,输出最长回文子串。
public String longestPalindrome(String s) {
// write code here
int len = s.length();
if(s==null||len<=0){
return null;
}
if(len==1){
return s;
}
int[][] pair = new int[len][len];
int max = 0;
int start = 0;
int end = 0;
for(int i=0;i0)){
pair[j][i]=i-j+1;
if(pair[j][i]>max){
max=pair[j][i];
start = j;
end = i;
}
}
}
}
return s.substring(start,end+1);
}
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。