发现一个重大问题:
最好以后取首地址都带上地址符&
,以及int
类型和char
类型的数组可以用*数组名
的方法获得首元素,但是string
类型不行,还是得用下标操作。
class Solution {
public:
int strToInt(string str) {
int i = 0;
//1. 过滤掉前置空格,直到不为空格的字符。
while(i < str.size() && str[i] == ' '){
++i;
}
if(i>=str.size()){
return 0;
}
bool sign=false;
//提取+,-符号。
if(str[i] == '-'){
sign=true;
++i;
}else if(str[i] == '+'){
++i;
}
//
if(i >= str.size()){
return 0;
}
if(!isdigit(str[i])){
return 0;
}
long long ans = 0;
//提取整数部分。累加过程中,如果正数 > INT_MAX时,返回INT_MAX. 如果负数 < INT_MIN时,返回INT_MIN.
while(i < str.size() && isdigit(str[i])){
ans = ans*10 +(str[i] - '0');
if(!sign && ans > INT_MAX){
return INT_MAX;
}else if(sign && -ans < INT_MIN){
return INT_MIN;
}
++i;
}
return sign ? -ans : ans;
}
};
作者:jason-2
链接:https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/solution/yi-ci-bian-li-by-jason-2-17wz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
isdigit():判断一个字符是否是十进制数字
这个我没在leecode里跑出来 不知道问题在哪
但是在vs里实现了 由于笔试的oj是牛客 所以不再纠结
vs代码:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int strToInt(string str) {
int sym = 1;//正负号
int num=0;//最后的值
bool valid = true;//无效字符串
//丢弃无用的开头空格字符
int i = 0;//开始循环下标
while (str[i] == ' ' || str[i] == '0'){ //这里注意是单引号
i++;
}
//符号判断
if (str[i] == '-'){
sym = -1;
i++;
}
else if (str[i] == '+'){
i++;
}else if(!(str[i]>='1'&&str[i]<='9')){
//第一个有效字符不是符号位也不是数字
//但是还要区分输入字符串就是-1的情况
valid=false;
return -1;
}
while (str[i] != '\0' && (str[i] >= '0'&&str[i] <= '9')){
num = num * 10 + sym*(str[i] - '0');
i++;
//if (num>0x7FFFFFFF || num<(signed int)0x80000000){
// return INT_MIN;
//}
}
return num;
}
};
int main(){
Solution a;
cout<<a.strToInt(" w-42ww")<<endl;
system("pause");
return 0;
}