LeetCode初级算法之字符串:字符串整数反转

题目描述1-字符串反转

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

思路: 这个思路比较简单,刚开拿到这个题,直接algorithm中的reverse,就A掉了, 但是调用别人的,自己的能力没法提高,所以就写了一个reverse, 双指针,一个指向头,从前往后,一个指向尾部,从后往前,每一次交换所指元素,直至相遇。

class Solution {
public:
    void reverse1(vector<char> &s)
    {
        int len = s.size();

        for (int i=0, j=len-1; i<=j; i++, j--)
        {
            swap(s[i], s[j]);
        }
    }

    void reverseString(vector<char>& s) {
        reverse1(s);

        // 这个如果调用algorithm库的话    reverse(s.begin(), s.end())   一句话A掉
    }
};

这里的reverse函数应该记好了这种格式,写起来比较方便,并且很实用。

题目描述二- 整数翻转
题目描述:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

思路:
这个题比较好使的方式,就是数学的方式,我们知道一个整数,除10取余,就把个位的数就分开了,然后本身/10,再除10取余,就十位数就出来了,以此类推。 这里提供两个版本:
第一个是我的初步思路,还把正负分开讨论了,其实可以合起来。 这个题比较麻烦的地方是溢出的问题,就是把每个数分开之后再合起来的时候, 每一次遍历会*10, 这时候可能会溢出,需要判断。
核心代码如下:

while (x)
        {
            res = res * 10 + x % 10;
            x /= 10;
        }

上面的代码就是核心的代码,就是一个整数反转, 也是应该记住。
放到这个题中, 需要在*10的地方加入一个判断是否溢出。
两版代码如下:

class Solution
{
public:
    int reverse(int x)
    {
        long long int  res = 0;
        // 判断一下x的符号,如果小于0, 变成绝对值操作,最后要加上-号
        if (x<0)
        {

            x = -x;

            //把每一位数拆开放入数组中
            while (x>0)
            {
                int yushu = x % 10;
                res = res * 10;
                if (res > pow(2, 31)-1 || res < -pow(2, 31)-1)
                    return 0;
                res = res + yushu;
                x /= 10;
            }

            res = -res;

        }
        else
        {
            //把每一位数拆开放入数组中
            while (x>0)
            {
                int yushu = x % 10;
                res = res * 10;
                if (res > pow(2, 31)-1 || res < -pow(2, 31)-1)
                    return 0;
                res = res + yushu;
                x /= 10;
            }
        }
        return res;
    }
};

简化的版本如下:

class Solution
{
public:
    int reverse(int x)
    {

        if(x/10 == 0) return x;       //平凡情况:若x∈[-9,9],则直接返回其本身
        
        long  res = 0;
        while (x)
        {
            res = res * 10;
            if (res > INT_MAX  || res < INT_MIN)
                return 0;
            res = res + x % 10;
            x /= 10;
        }

      return res;
    }
};
发布了66 篇原创文章 · 获赞 67 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wuzhongqiang/article/details/103247743
今日推荐