选了门算法分析与设计,老师推荐了leetcode网站作为编程的练习。第一次接触这个网站,感觉有点意思,再加上许久不打类似的题目有点生疏,选了个easy的题目试了试手,还是能找到自己的不足之处。
Reverse Integer
一个很easy的题目,但是我用的方法好像非常的复杂……
首先写了个int转string的函数
void int2string(const int& num, string &str) {
stringstream ss;
ss << num;
str = ss.str();
}
接着再写个string转int的函数
void string2int(const string &str, int& num) {
stringstream ss;
ss << str;
}
然后完成主体函数
int reverse(int x) {
string str, res;
int2string(x, str);
if (str[0] == '-') {
res = "-";
for (int i = str.size()-1; i >= 1; i--) {
res += str[i];
}
} else {
res = "";
for (int i = str.size()-1; i >= 0; i--) {
res += str[i];
}
}
int r = 0;
string2int(res, r);
return r;
}
根据题目要求判断溢出,我选择把判断的部分放入string2int中,修改如下
void string2int(const string &str, int& num) {
stringstream ss;
ss << str;
string max, min;
int2string(INT_MAX, max);
int2string(INT_MIN, min);
if (str[0] == '-') {
if (str > min && str.size() == 11 ) {
num = 0;
} else {
ss >> num;
}
}
else if (str[0] != '-') {
if (str > max && str.size() == 10) {
num = 0;
} else {
ss >> num;
}
}
else {
ss >> num;
}
}
可以看出不是很理想…非常不理想,因此想办法改进。
之前处理溢出的时候选择了在string里判断,其实可以将中间的int改为long,就可以判断int的溢出
于是修改代码如下
void string2int(const string &str, long& num) {
stringstream ss;
ss << str;
ss >> num;
}
long reverse(int x) {
string str, res;
int2string(x, str);
if (str[0] == '-') {
res = "-";
for (int i = str.size()-1; i >= 1; i--) {
res += str[i];
}
} else {
res = "";
for (int i = str.size()-1; i >= 0; i--) {
res += str[i];
}
}
long r = 0;
string2int(res, r);
if (r > INT_MAX || r < INT_MIN) return 0;
return r;
}
比较简洁,速度也算可以接受
对于一个easy的题目个人认为到此为止就可以了,是时候开始正式体验leetcode的乐趣了