持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
题目,本文对应第九题和第十四题:
- 判定一个整数是否是回文数,如果是回文数则返回True,否则返回False。
- 编写一个函数来查找字符串数组的最长公共前缀。
解题思路
第九题是一道简单题,也是一道经典的判定回文数的题,因此解题思路一就是将数字看成字符串,之后可以将数字反转比较是否相同或者二分比较来判断对应字符是否相同即可,可得代码如下:
public boolean isPalindrome(int x) {
if(x<0) return false;
String s = String.valueOf(x);
int len = s.length();
for(int i=0;i<len/2;i++){
if(s.charAt(i)!=s.charAt(len-i-1)){
return false;
}
}
return true;
}
上述方法判定回文数的时间复杂度为。
本题还有更巧妙的方法,我们可以通过数的逆序和数的正序进行比较,具体来说,我们使用一个变量reverseNum来接收反转后的值,接收规则为:
在此过程中,我们需要始终保证x>reverseNum,这样如果数字的长度是偶数的时候则最终的x == reverseNum,如果是奇数则可得到x == reverseNum / 10。可得代码如下:
public boolean isPalindrome(int x) {
if(x<0||(x%10==0)&&x>0) return false;
int reverseNum=0;
while(x>reverseNum){
reverseNum = reverseNum*10 + x%10;
x /= 10;
}
return x == reverseNum || x == reverseNum/10;
}
此方法时间复杂度为。
对于第十四题,要计算字符串数组的最长公共前缀,暴力的思路是判断首个字符串的所有子前缀,之后依次遍历字符串数组每个字符,判断是否每个字符都包含此前缀,每次更新前缀即可。
但上述方法时间复杂度较高,另一种思路是因为最长子前缀必然是字符串数组中的某个字符串的子串,因此假设第一个子串即为最长公共前缀,之后遍历数组,每次判断当前子串是否在遍历到的字符串中,如果不在则不断缩减当前子串,依次遍历即可。
可得代码如下:
public String longestCommonPrefix(String[] strs) {
String longestPrefix = strs[0];
for(int i=1;i<strs.length;i++){
while(!strs[i].startsWith(longestPrefix)){
longestPrefix = longestPrefix.substring(0, longestPrefix.length()-1);
}
}
return longestPrefix;
}