算法与C++

Leetcode9. Palindrome Number

2019-01-25  本文已影响4人  Vophan

每日必刷

题目

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

思路

这是一道很简单的题,我们只需要考虑到一些特殊情况,比如说负数不是回文数,还有最后一位为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可以用来类型推断。

上一篇下一篇

猜你喜欢

热点阅读