每日必刷
题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
思路
这是一道很简单的题,我们只需要考虑到一些特殊情况,比如说负数不是回文数,还有最后一位为0的非零数,还有0
考虑到这些以后,解题就很简单了。
我的思路是,像昨天那道题,直接化为字符串,这样就直接忽略了负数的情况,然后翻转字符串,就很简单了。
代码
static int x = [](){ios::sync_with_stdio(false); cin.tie(nullptr); return 0; }();
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) {
return false;
}
std::string s = std::to_string(x);
if (s[s.length()-1] == '0' and s != "0") {
return false;
}
else{
std::string tmp = s;
std::reverse(s.begin(), s.end());
if (s == tmp) {
return true;
}
else{
return false;
}
}
}
};
说来很惭愧,我第一次提交,用时160ms,着实吓了我一跳。
本来昨天8ms解决的问题,我今天才拿来用,结果...
骚操作
看了一下第一名做的代码,我发现了一个新天地:
先看代码:
static int x = [](){ios::sync_with_stdio(false); cin.tie(nullptr); return 0; }();
class Solution {
public:
bool isPalindrome(int x) {
int numSrc = x;
long long numDst = 0;
if (x < 0)
{
return false;
}
while (numSrc)
{
numDst = numDst * 10 + numSrc % 10;
numSrc /= 10;
}
return (numDst == x);
}
};
看了一下,他用的是昨天的第二种方法,模10取余的方法,来进行回文,这个还比较正常,最骚的是第一句话,我把它加上后,时间瞬间从160ms变成了120ms,于是我去查了一下:
这里面用到了c++ 11的内容:
1、lambda表达式
2、auto自动推断
3、C++与C的兼容性
我们单来分析一下这句话:
static int x = [](){ios::sync_with_stdio(false);cin.tie(nullptr);return 0;}
这句话首先用了忽略返回值的lambda表达式(自动推断),然后,sync_with_stdio()实际上是说是否兼容scanf和printf,是将cin与scanf绑定在一起的函数,而cin.tie()则是用来绑定cin与cout的。
我们取消了这两种,速度自然就提升了上来。
反思
1、string直接赋值是浅复制
2、algrothm和string里面都有翻转,也都没有返回值
3、auto可以用来类型推断。
网友评论