目录
0. 题目描述
1. 解题分析
(1) 题目要求对整数进行反转,首先就想到了可以利用栈这个数据结构。于是有了一个很自然很暴力的思路:
将int型的数字转换成string字符串,逐一遍历每个字符并将其压入栈中,再一个个pop出来,就得到了一个反序的字符串,再将字符串转换回int型数字。
#include<string>
#include<stack>
int reverse(int x) {
stack<char> s;
string str = to_string(x);
int start = 0, result;
if (str[0] == '-') { //如果为负数,遍历下标从1开始
start = 1;
}
while (str[str.length() - 1] == '0' && str.length() != 1) { //擦除数字反转前所有的末尾0
str.erase(str.length()-1);
}
//遍历string中每一个数字,压栈,出栈,进行反转
int length = str.length();
for (int i = start; i < length; i++) {
s.push(str[i]);
}
int index = 0;
while(!s.empty()) {
str[index++] = s.top();
s.pop();
}
str[index] = '\0';
try { //转换string → int
result = stoi(str);
}
catch (const std::out_of_range& e) { //如果溢出则置0
result = 0;
}
if (start == 1) {
result = 0 - result;
}
return result;
}
复杂度分析
-
时间复杂度 O(n)。
-
空间复杂度 O(n) 。
测试用时20ms,优于70%左右的提交。
(2) 傻写了半天,突然想到字符串反转这种操作大概率是已经存在轮子的,为什么还要吭呲吭呲自己造。搜了一下发现果然有:
第一种:string.h中的strrev函数
char s[]="hello"; strrev(s);
第二种: algorithm中的reverse函数
reverse(str.begin(),str.end());
尝试了第二种的效率,结果:测试用时20ms,优于70%左右的提交。并无明显差别……
待优化……