问题:

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. CVTE实习求职经历

    今天,听到有好多同学最近要去面试CVTE这家企业,于是呢,准备将自己的经历写上来,给大家一个参考,希望能够大家一次帮助. 一.整体感觉 首先呢,先讲一下我个人对这家企业的整体感觉吧. 1. 第一次 对 ...

  2. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  3. ubuntu升级内核后vmware-player启动失败

    在虚拟机软件中,vmware player是对硬件支持很好的,通过它可以很方便的使用网银.单片机开发等等工作.但是最近ubuntu每次升级内核后,vmware都会启动失败,提示:Before you ...

  4. Hibernate 3.3.2 文档翻译 Day01

    Hibernate 3.3.2 文档翻译 翻译人:微冷的雨 第一次书写:2015年11月29日 本人呕心沥血之作,请细心阅读领悟! Day01-1.1 项目描述 微冷的雨翻译:例如,我们将要建立一个可 ...

  5. Sql Server系列:数据控制语句

    数据控制语句用来设置.更改用户或角色的权限,包括GRANT.DENY.REVOKE等语句. GRANT用来对用户授予权限,REVOKE可用于删除已授权的权限,DENY用于防止主体通过GRANT获得特定 ...

  6. EF Power Tools参数不正确的解决方法

    在Visual Studio 2010安装了EF Power Tools Beta 3之后,希望根据本地现有数据库模型来生成基于Entity Framework Code First的代码时,经常出现 ...

  7. 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍

    考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...

  8. 通过配置http拦截器,来进行ajax请求验证用户登录的页面跳转

    在.NET中验证用户是否登录或者是否过期,若需要登录时则将请求转向至登录页面. 这个流程在进行页面请求时是没问题的,能正确进行页面跳转. 然而在使用xmlhttprequest时,或者jq的getJs ...

  9. 小菜学习Winform(三)Socket点对点通信

    前言 Socket的英文原义是“孔”或“插座”,其实在网络编程中Socket就是这个意思,就像我们打电话,要首先知道对方的手机号一样,这个手机号就相当于一个Socket号.一个插座,在网络编程中就是i ...

  10. Lua 学习笔记(七)编译、执行外部代码块

    Lua称为解释型语言的原因:Lua允许在运行源代码之前,先将源代码预编译为一种中间形式.区别解释型语言的主要特征是在于编译器是否是语言运行时库的一部分,即有能力执行动态生成的代码.因为Lua中有dof ...