问题:

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases.

官方难度:

Easy

翻译:

实现atoi功能,将一个字符串转化成一个整数。

提示:仔细考虑各种可能出现的情况。

补充资料:

所谓atoi,是C语言库中的一个函数,其功能如下:

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.

函数atoi要求:

  • 丢弃第一个非空格字符串之前的所有字符串。
  • 剩余字符串接受以“+”或“-”操作符起始的数字,在遇到下一个非数值字符串之前,截取尽可能多的字符串,将其转化成数值。
  • 忽略之后遇到的非数值字符串。如果第一个非空格字符串不是数值,或者原字符串就是空格字符组成,抑或是空字符串,那么不做转换。
  • 如果不做转换,函数返回0;如果结果超出int型能表达的最大/最小值,返回整型数的最大/最小值。
  1. 先去除原字符串的前后空格,使用String.trim()方法。
  2. 处理之后的字符串,做长度为0的特殊处理,返回0。
  3. 记录第一个是“+”或“-”操作符的情况,利用一个标志位记录,在返回时使用,同时将这个位置用字符0替换,不影响之后的累加操作。
  4. 记录遇到第一个非数值字符之前的长度length。
  5. 累加数值,这里要注意两点。第一点,length作为循环退出条件,又要在操作中自减,所以需要准备一个副本;第二点,char型的字符,用于数值计算,使用array[i]-‘0’来表示当前的数值。
  6. 用long型的sum来记录累加的数值,乘以标志位置后做超出范围操作。
  7. 注意入参检查。

解题代码:

 public static int myAtoi(String str) {
if (str == null) {
throw new IllegalArgumentException("Input error");
}
// 先去空格
char[] array = str.trim().toCharArray();
// 0特殊处理
if (array.length == 0) {
return 0;
}
// 正负号标志位
int sign = 1;
long sum = 0;
if (array[0] == '+' || array[0] == '-' || (array[0] >= '0' && array[0] <= '9')) {
// 操作符置char型的'0'
if (array[0] == '+') {
array[0] = '0';
sign = 1;
} else if (array[0] == '-') {
array[0] = '0';
sign = -1;
}
// 循环确定长度
int length = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] >= '0' && array[i] <= '9') {
length++;
} else {
// 遇到非数值退出循环
break;
}
}
// length值作为退出条件,但同时又要自减,准备一个副本
int exit = length;
for (int i = 0; i < exit; i++) {
// char型的数值,转换成数值型处理
sum += (array[i] - '0') * Math.pow(10, --length);
}
// 超出范围处理
long num = sum * sign;
if (num > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (num < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
return (int) num;
} else {
return 0;
}
}

myAtoi

相关链接:

https://leetcode.com/problems/string-to-integer-atoi/

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/easy/Q008.java

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

No.008:String to Integer (atoi)的更多相关文章

  1. Q8:String to Integer (atoi)

    8. String to Integer (atoi) 官方的链接:8. String to Integer (atoi) Description : Implement atoi to conver ...

  2. leetcode:String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  3. No.008 String to Integer (atoi)

    8. String to Integer (atoi) Total Accepted: 112863 Total Submissions: 825433 Difficulty: Easy Implem ...

  4. LeetCode--No.008 String to Integer (atoi)

    8. String to Integer (atoi) Total Accepted: 112863 Total Submissions: 825433 Difficulty: Easy Implem ...

  5. 《LeetBook》leetcode题解(8): String to Integer (atoi) [E]——正负号处理

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  6. 【leetcode】String to Integer (atoi)

    String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...

  7. leetcode day6 -- String to Integer (atoi) &amp;&amp; Best Time to Buy and Sell Stock I II III

    1.  String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully con ...

  8. Kotlin实现LeetCode算法题之String to Integer (atoi)

    题目String to Integer (atoi)(难度Medium) 大意是找出给定字串开头部分的整型数值,忽略开头的空格,注意符号,对超出Integer的数做取边界值处理. 方案1 class ...

  9. 【Leet Code】String to Integer (atoi) ——常考类型题

    String to Integer (atoi) Total Accepted: 15482 Total Submissions: 106043My Submissions Implement ato ...

随机推荐

  1. 使用JavaMail创建邮件发送邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  2. Java程序员的日常—— FileUtils工具类的使用

    package cn.xingoo.learn.commons; import org.apache.commons.io.FileUtils; import org.apache.commons.i ...

  3. Sql Server系列:数据库组成及系统数据库

    1. 数据库组成 数据库的存储结构分为逻辑存储结构和物理存储结构. ◊ 逻辑存储结构:说明数据库是由哪些性质的信息所组成.SQL Server的数据库不仅仅只是数据的存储,所有与数据处理操作相关的信息 ...

  4. Sql Server系列:系统函数

    1. 返回表中指定字段的长度值COL_LENGTH 返回列的定义长度(以字节为单位). 语法: COL_LENGTH ( 'table' , 'column' ) 示例: SELECT COL_LEN ...

  5. 12款非常精致的免费 HTML5 & CSS3 网站模板

    01. Joefrey Mahusay 很炫的单页网站模板,基于 HTML5 & CSS3 制作,适合用于设计师个人简历.摄影师和平面设计师的个人作品展示. 演示  下载 02. Folder ...

  6. Android之计算缓存大小并且清空缓存

    转载博客:http://www.2cto.com/kf/201503/385492.html 项目中碰到了计算缓存大小和清空缓存的功能,这个很常见的功能,几乎每个APP都有,以为实现很简单,网上搜了一 ...

  7. IOS学习之初识KVO

    什么是KVO? KVO(Key-Value Observing)键值观察,是一种通过对对象的某一个属性添加观察者,一旦这个属性值发生变化,就会通知当前观察者的一种机制. 该如何使用? 1.注册,指定被 ...

  8. IOS数据存储之CoreData使用优缺点

    前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据库的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数 ...

  9. Cmd Markdown编辑器简明语法手册

    标签: Cmd-Markdown 1. 斜体和粗体 使用 * 和 ** 表示斜体和粗体. 示例: 这是 斜体,这是 粗体. 2. 分级标题 使用 === 表示一级标题,使用 --- 表示二级标题. 示 ...

  10. MyCAT日志分析

    MyCAT日志对于了解MyCAT的运行信息不可获取,譬如MyCAT是否采用读写分离,对于一个查询语句,MyCAT是怎样执行的,每个分片会分发到哪个节点上等等. 默认是info级别,通过log4j.xm ...