2019年5月28日 第一次练习(7整数反转)

这篇博客介绍了如何使用C/C++实现整数反转,从最初的栈思想到利用数学方法。作者首先提出将数字转为字符并使用栈操作,然后探讨了使用`find_first_not_of`和`reverse`函数简化问题,最后提到了官方的数学解法及其解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次练习

7.整数反转

自己的想法

题目要求把一个32位 有符号 数进行反转。
首先我考虑的是利用栈的思想
但应该把数字转变成字符形式,一个个入栈然后再出栈。
要注意负数和末尾是0的数

但作为一个菜鸟,
1.怎么把数字形式转变为字符形式?
2.怎么用语言进行栈的实现?

首先按照自己的思路解决以上两个问题:
1.将数字转换为字符形式:
to_string()方法 但是要#include<string’>方法
实现:

int reverse(int x){
string str_x=to_string(x);
}

2.利用栈的思想进行反转

 int n=str_x.size();
 const char * ss=str_x.c_str();//将字符串类型转化为字符型,方便入栈操作
 std::stack <char> text;//建立栈
 int i=0;
 while(n--){
   text.push(ss[i++]);
           }//将字符一一入栈
 while(!text.empty()){
   char c=text.top();
   str_x+=c;
   text.pop();
           }出栈,并将字符加入到原来字符串后面
   stringstream out(str_x);//转换为字符流,为转换成整数操作作准备
   out >>long_x;//将string转换成long存储在long_x中//转化成整数
   if(long_x>INT_MAX || long_x<INT_MIN)
     return 0;
   return long_x;

在我的思路下看到的比较好的解法

但,看完解析感觉自己想的有点偏,运用栈有点复杂,而且自己考虑的情况也不是很全。对于后面用栈实现的方法可以直接用函数reserver实现。
就我开始的这个思路,某位大佬是这样写的:

class Solution {
public:
    int reverse(int x) {
        long long_x;
        string str_x=to_string(x);//将数字转换成字符串
        int pos=str_x.find_first_not_of("-");
        //找到第一个与‘-’不匹配的字符位置
        
        std::reverse(str_x.begin()+pos,str_x.end());
        //将除符号位的数字进行反转

        stringstream out(str_x);
        out >>long_x;//将string转换成long存储在long_x中
        if(long_x>INT_MAX || long_x<INT_MIN)
            return 0;
        return long_x;    
    }
};

这里学习的方法:
(1)找到第一个与“XXX”不匹配的字符并返回他的位置

size_type find_first_not_of( const basic_string &str, size_type index= 0 );
size_type find_first_not_of( const char *str, size_type index = 0 );
size_type find_first_not_of( const char *str, size_type index,size_type num );
size_type find_first_not_of( char ch, size_type index = 0 );

使用方法为:

在字符串中查找第一个与str中的字符都不匹配的字符,返回它的位置。搜索从index开始。如果没找到就返回string::nops
在字符串中查找第一个与str中的字符都不匹配的字符,返回它的位置。搜索从index开始,最多查找num个字符。如果没找到就返回string::nops
在字符串中查找第一个与ch不匹配的字符,返回它的位置。搜索从index开始。如果没找到就返回string::nops

(2)reverse()函数的用法 其实这里就是把我开始用栈实现的思想直接用已知函数实现出来了而已。

reverse函数用于反转在[first,last)范围内的顺序(包括first指向的元素,不包括last指向的元素)

往往需要包含头文件 #include <algorithm‘>
(3)string类型的begin, end,rebegin,rend方法

begin();
解释:begin()函数返回一个迭代器,指向字符串的第一个元素.
end();
解释:end()函数返回一个迭代器,指向字符串的末尾(最后一个字符的下一个位置).
rbegin();
解释:rbegin()返回一个逆向迭代器,指向字符串的最后一个字符。
rend();
解释:rend()函数返回一个逆向迭代器,指向字符串的开头(第一个字符的前一个位置)。

在这里插入图片描述

(4)istringsteam类istringstream类可以用作string与各种类型的转换途径
代码中istringsteam out(str_x)是创建了一个流
使用时记得加include<sstream’>
具体用法我觉得这个博客里写的蛮好的
https://blog.youkuaiyun.com/xw20084898/article/details/21939811

但真正官方给出的题解是这样的,是利用了一个数学的方法:

class Solution {
public:
    int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;//取最后一位数
            x /= 10;//取去掉最后一位数的剩下的数
            if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
       //末尾为7和-8是因为-2^31^=-2147483648 , 2^31^-1=2147483647               
             rev = rev * 10 + pop;
        }
        return rev;
    }
};

但我看不懂啊,又找到了某位大神给出了这样的解释:

反转整数的思路是从一个数的最后一位开始,依次向前遍历,每次反转整数依次左移一位,并取出一位数作为新数的末位数。具体而言首先定义反转以后的数res初始为0,当x不为0时循环:记录temp=res*10+x%10,此时temp即为遍历到当前位之前的反转整数。然后比较temp/10与res是否相等,如果整数不溢出显然相等,否则说明反转后的整数溢出,直接返回0。最后把temp赋值给res,并令x=x/10,即去掉最后一位,继续反转之前的数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值