回文数题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
链接:
https://leetcode.cn/problems/palindrome-number/description/
解题思路
这道题我再做时我的思路是如何做到让它从前到后都要一样,我的第一想法就是把数字拆分到数组里面,然后利用双下标的方法让它能够最后一个数字和第一个相同,倒数第二个与第二个相同知道匹配结束就能知道它是否是一个回文数。
代码
下面直接上代码:
class Solution {
public:
bool isPalindrome(int x) {
if(x<0){//负数直接排除
return false;
}
if(x<=9){//小于10也直接排除
return true;
}
int tem=x;//临时变量保存x
int count=0;//创建计数器
while (tem != 0) {//得出计算几次
tem /= 10;
count++;
}
tem = x;//继续用tem保存x
int arr[10000];//因为力扣好像不支持定义arr[count]就随便定义一个长度数组
for (int i = 0; i < count; i++) {
arr[i] = tem % 10;
tem /= 10;
}
int j=count-1;
int i=0;
int flag=0;//创一个标记看它是否相同
while(i<j){
if(arr[i]!=arr[j]){//若出现不同直接false
flag=0;
return flag;
}
else{
flag=1;//若成功则返回true
}
i++;
j--;
}
return flag;
}
};
通过截图:
回文字符串题目
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
解题思路
这道题要比回文数要难,方法有很多可以动态规划,也可以由中点扩散,而我觉得中点往两边走比较简单就用的中间往2边走的方法,要想截取最长的回文子串那么从中间往2边走会出现2种情况,就是中点是哪个,要么是偶数的子串要么是奇数的子串,我的方法是设置2个坐标往2边出发,偶数子串左边坐标是i,右边就是i+1,奇数子串则左右坐标相同。
代码
下面直接上代码:
class Solution {
public:
int max=0;
int left=0;
int right=0;
string longestPalindrome(string s) {
//回文字符串就是从后往前还是从前往后看一致
for(int i=0;i<s.size();i++){
fun(s,i,i,s.size());//奇数情况
fun(s,i,i+1,s.size());//偶数情况
}
return s.substr(left,max);
//截取长度从左边坐标开始到满足回文子串的坐标
}
void fun(const string&s,int i,int j,int n){
while(i>=0&&j<n&&s[i]==s[j]){
if(j-i+1>max){
left=i;
right=j;
max=j-i+1;
}
i--;
j++;
}
}
};
通过截图: