第一次练习
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,即去掉最后一位,继续反转之前的数字。