Leecode 8: String to Integer (atio)

来源:互联网 发布:中国知网专利数据库 编辑:程序博客网 时间:2024/06/05 20:44

Leecode 8:String to Integer (atio)


题目中大致的意思是将一个string型变量转化为int型变量,并没有涉及到边界条件,都是需要自己去界定的,设输入的字符串为str,这题包含的边界条件有如下:

(1)如果字符串str为空串,此时返回0;(如 str = "",输出为0)

(2)如果字符串str之前有空格时,需要跳过这些空格;(如str = "       -123",输出-123)

(3)如果字符串str从前向后第一个非空格字符不是‘0’~‘9’,返回0;(如str = “a111”,输出0)

(4)如果字符串str从前向后第一个非空格字符是‘+’或者‘-’,str仍然有效,即需要跳过+和-转化后面的字符串;(如str = “+123”,返回123,;str = "-123",返回-123)

(5)如果字符串sr转化后的数大于int型的最大值,返回int型的最大值,即INT_MAX;

(6)如果字符串str转化后的数小于int型的最小值,返回int型的最小值,即INT_MIN;

(7)如果只转化从字符串str第一个非空格字符的位置起,到下一个非‘0’~‘9’的字符结束中的内容。(如str = "   -123a34",,输出为-123,而忽略后面的“a34”)

将以上的边界条件考虑到代码中,转化的过程就是取每一位的字符(‘0’~‘9’),减去‘0’转化为数字,在进行拼接,可以得到代码的第一个版本:

class Solution {public:    int myAtoi(string str){int n = str.length() ;if(n == 0) return 0;  //约束(1)long long result = 0;bool flag = true;bool isDelete = false;bool time = true;  int start = 0;for(int i = 0; i < n && flag; i++){while(str[i] == ' ' && flag && time && i < n)  //使用time来控制只执行一次,即跳过开始的所有空格,约束(2){i ++;start ++;}time = false;if(str[i] > '9' || str[i] < '0')    //约束(3),约束(7)flag = false;if(i == start && (str[i] == '+' || str[i] == '-'))   //约束(4){if(str[i] == '-')   //针对-号,要另外区别,在最后的结果乘以-1isDelete = true;flag = true;str[i] = '0';}if(flag) result = result * 10 + str[i] - '0';  //转化过程if(result > INT_MAX) break;}if(isDelete) result *= -1;if(result > INT_MAX) return INT_MAX;    //约束(5)if(result < INT_MIN) return INT_MIN;    //约束(6)return (int)result;    }};
以上代码运行时间为12ms,在提交的结果里面已经很慢了,我就在上面的代码版本上重新组织了一下,进行了优化,优化版本如下:

class Solution {public:    int myAtoi(string str){int n = str.length() ;if(n == 0) return 0;int start = 0;while(str[start] == ' ') start ++;   //跳过开始所有的空格bool isDelete = false;  if(str[start] == '-') isDelete = true;  //如果开头是-号if((str[start] == '+') || isDelete) start ++; //如果开头是+号或者-号,则跳过+和-long long result = 0; //使用long long型变量,用来控制越界问题for(int i = start; i < n && str[i] >= '0' && str[i] <= '9'; i++){    result = result * 10 + str[i] - '0';    if(result > INT_MAX) break;  //一旦发现有越界问题,则终止}if(isDelete) result *= -1;if(result > INT_MAX) return INT_MAX;  //大于int最大值的取最大值if(result < INT_MIN) return INT_MIN;  //小于int最小值的取最小值return (int)result;    }};
优化好的代码运行时间为8ms,速度还可以啦!!!

第一次在CSDN上发帖,刚好今天晚上在刷Leecode,就把Leecode第8的题的代码搬上来了,大家有什么更好的代码也可以贴出来交流交流呢!!!大笑













1 0
原创粉丝点击