Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

写一个a to i 字符串转为整形的函数。

注意考虑所有可能的输入情况。

题目不设置具体的输入规范,你需要思考收集所有可能的输入。

Requirements for atoi:

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

If no valid conversion could be performed, a zero value is returned. If the correct value is out of the range of representable values, INT_MAX (2147483647) or INT_MIN (-2147483648) is returned.

函数要求:

函数首先应该丢弃字符串首字符前的空白格;

判断数字的正负符号,并将后面跟着的数字符号转化为数值;

在数字字符之后,可能还包含其他不相关字符,这些字符应该省去;

如果在空白格后,第一个字符不是有效的数字字符,或者根本没有有效的数字字符存在,那么不需要进行转化,返回空;

如果没有有效的字符可以进行转化,那么返回0;

如果正确的数值超过了能表示的范围,那么返回INT_MAX或者INT_MIN。

解题:

对于一个输入,基本需要考虑4种情况:

1、删去头部的空白格(空格);

2、判断数字的正负;

3、注意整形溢出;

4、处理无效的输入。

解题步骤:

1、不管输入是char *还是 stl string,需要三个int变量,正负号sign,结果值base,操作序号i;

2、判断输入是否有效;

3、删去头部的空格;

4、判断正负符号,用一些技巧使正时sign为1,负时sign为0;

5、判断字符是否是数字,如果是:

  (1)在计算此数字之前,查看当前base是否已经越界,即是否能安全的计算当前数字;

    即 base < INT_MAX / 10; 或者 base == INT_MAX / 10 && 当前数字 <= INT_MAX % 10;

  (2)计算当前数字;

6、返回代符号的base;

代码借鉴自Leetcode上题后讨论

 class Solution {
public:
int atoi(const char *str) {
int sign = , base = , i = ; while (str[i] == ' ')
i++; if (str[i] == '-' || str[i] == '+') {
sign = - * (str[i++] == '-');
} while (str[i] >= '' && str[i] <= '') {
if (base > INT_MAX / || (base == INT_MAX / && str[i] - '' > )) {
if (sign == )
return INT_MAX;
else
return INT_MIN;
}
base = * base + (str[i++] - '');
} return base * sign;
}
};

最新文章

  1. ActiveMQ笔记(4):搭建Broker集群(cluster)
  2. Mysql学习笔记(附一)
  3. iOS 支付宝第三方使用步骤
  4. MySQL(四) 数据表的插入、更新、删除数据
  5. telnet: connect to address 127.0.0.1: Connection refused
  6. 2015弱校联盟(1) - I. Travel
  7. Hibernate4.x之Session
  8. 阿里IPO弃港赴美?
  9. 使用Git与Github创建自己的远程仓库
  10. weblogic AND jboss 反序列化漏洞
  11. MongoDB学习(管理数据库和集合)
  12. Mountaineers Gym - 102021M (LCA+MST)
  13. 【转载】tolua之wrap文件的原理与使用
  14. SSH连接Linux操作:
  15. Matplotlib 基本用法
  16. python:python之禅
  17. 在SpringBoot2.0及Spring 5.0 WebMvcConfigurerAdapter已被废弃,目前找到解决方案就有两种
  18. ML: 降维算法-LE
  19. excel怎样添加的选项卡中含有下拉列表
  20. L017-linux系统定时任务crond入门小节

热门文章

  1. bzoj3252 攻略 dfs序+线段树
  2. maven tomcat eclipse 配置 debug
  3. 分享个高精度IP定位
  4. shell编程下
  5. PIE SDK图像镜像
  6. baidumapapi点线面的绘制已离线化
  7. linux安装git、node、pm2
  8. concat、concat_ws、group_concat函数用法
  9. 2017年10月29日 数据库查询总结&amp;45道题
  10. WinSock Socket 池