乘风破浪:LeetCode真题_008_String to Integer (atoi)

一、前言

将整型转换成字符串,或者将字符串转换成整型,是经常出现的,也是必要的,因此我们需要熟练的掌握,当然也有很多工具来实现了,但是在这个基础上加入一些其他的因素就是考点的所在了。

二、String to Integer (atoi)

2.1 问题理解

2.2 问题分析和解决

    看到这个问题,我们就需要遍历字符串,然后判断开始的时候是不是空格,+,-,或者数字,如果不是的话就是不合理的,如果是,则继续向后遍历,直至遇到其他字符为止,将这之间的内容保存下来,并且转换成整型数据。如果发现大于整型的范围则根据正负返回相应的结果。

    我们的代码:

 public class Solution {

     public int myAtoi(String str) {

         if (str == null || str.length() == 0) {
return 0;
} // 如果字符串以空格开始
int start = 0; //从开始找第一个不是空格的数
boolean positive = true; // 是否为正数默认为true if (str.charAt(start) == ' ') {
while (str.charAt(start) == ' ') {
start++;
if (start >= str.length()) { // 输入的全是空格
return 0;
}
}
} if (str.charAt(start) == '-') { // 第一个非空白字符中-
positive = false;
start++;
} else if (str.charAt(start) == '+') {// 第一个非空白字符是+
start++;
} else if (str.charAt(start) >= '0' && str.charAt(start) <= '9') { // 第一个非空白字符是数字
return cal(str, start, true);
} else { // 其它情况就抛出异常
return 0;
} if (start >= str.length()) { // 第一个非空白字符是+或者-但也是最后一个字符
return 0;
} if (str.charAt(start) > '9' || str.charAt(start) < '0') { // +或者-后面接的不是数字
return 0;
} else {
return cal(str, start, positive);
}
} private int cal(String str, int start, boolean positive) { long result = 0;
while (start < str.length() && str.charAt(start) >= '0' && str.charAt(start) <= '9') {
result = result * 10 + (str.charAt(start) - '0'); if (positive) { // 如果是正数
if (result > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
} else {
if (-result < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
} start++;
} if (positive) {
return (int) result;
} else {
return (int) -result;
}
}
}

三、总结

通过这样的实践,使得我们对于一些细节上的东西有了更深刻的认识,比如越界问题,比如正负号问题,以及正负号之后是不是数字,空格等等的解决方法。

乘风破浪:LeetCode真题_008_String to Integer (atoi)的更多相关文章

  1. 乘风破浪:LeetCode真题_013_Roman to Integer

    乘风破浪:LeetCode真题_013_Roman to Integer 一.前言 上一节我们讨论了如何把阿拉伯数字转换成罗马数字,现在我们需要思考一下如何把罗马数字转换成阿拉伯数字,其实我们仔细观擦 ...

  2. 乘风破浪:LeetCode真题_007_Reverse Integer

    乘风破浪:LeetCode真题_007_Reverse Integer 一.前言 这是一个比较简单的问题了,将整数翻转,主要考察了取整和取余,以及灵活地使用long型变量防止越界的问题. 二.Reve ...

  3. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  4. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  5. 乘风破浪:LeetCode真题_032_Longest Valid Parentheses

    乘风破浪:LeetCode真题_032_Longest Valid Parentheses 一.前言 这也是非常有意思的一个题目,我们之前已经遇到过两个这种括号的题目了,基本上都要用到堆栈来解决,这次 ...

  6. 乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words

    乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words 一.前言    这次我们还是找字符串的索引,不过,需要将另一个字符串列表中的 ...

  7. 乘风破浪:LeetCode真题_029_Divide Two Integers

    乘风破浪:LeetCode真题_029_Divide Two Integers 一.前言     两个整数相除,不能使用乘法除法和取余运算.那么就只能想想移位运算和加减法运算了. 二.Divide T ...

  8. 乘风破浪:LeetCode真题_018_4Sum

    乘风破浪:LeetCode真题_018_4Sum 一.前言 前面我们已经练习过了三个数相加的集合运算,现在变成了四个数,其实道理是一样的.三个数的时候可以转成两个数的加法,最后来解决,而四个数的可以转 ...

  9. 乘风破浪:LeetCode真题_015_3Sum

    乘风破浪:LeetCode真题_015_3Sum 一.前言 关于集合的操作,也是编程最容易考试的问题,比如求集和中的3个元素使得它们的和为0,并且要求不重复出现,这样的问题该怎么样解决呢? 二.3Su ...

随机推荐

  1. NodeJS,MongoDB,Vue,VSCode 集成学习

    NodeJS,MongoDB,Vue,VSCode 集成学习 开源项目地址:http://www.mangdot.com

  2. DataGrridView 当前行显示不同颜色

    如果想让选中DataGridview的行显示不同颜色,就要通过DataGridview控件RowPerpaint事件中重新设置所选行的DefauleCellStyle属性来实现 private voi ...

  3. C# 创建、部署、调用WebService

    webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice的例子.这里我用的是Visual Studio 201 ...

  4. .net core 导出excel

    1.使用NuGet 安装 EPPlus.Core, 2.代码如下 using OfficeOpenXml; using OfficeOpenXml.Style; public IActionResul ...

  5. JSONObject与null

    前言 今天在写代码的时候发现在 JSON 中 由于put了key对应的value为null,结果这个JSON键值对没有输出 org.json.JSONObject 在orgJSON 中,如果直接put ...

  6. Spring Boot学习笔记(五)整合mybatis

    pom文件里添加依赖 <!-- 数据库需要的依赖 --> <dependency> <groupId>org.mybatis.spring.boot</gro ...

  7. JavaScript根据国家二字码获取国家全称

    function getCountryNameByCode(code) { var countryName = ''; switch(code) { case "US": coun ...

  8. #if, #elif, #else, #endif 使用

    程序想要通过简单地设置一些参数就生成一个不同的软件,在不同的情况下可能只用到一部分代码,就没必要把所有的代码都写进去,就可以用条件编译,通过预编译指令设置编译条件,在不同的需要时编译不同的代码. (一 ...

  9. 【C++并发实战】(一)并发基本概念

    什么是并发 并发,最简单的理解就是,两个或者以上的活动同时进行.举个比较实际的例子,你可以手脚并用,两只手做不同的动作等等. 在计算机中的“并发”,是指一个系统可以同时执行多个独立的活动.在以前大多数 ...

  10. 如何在iview组件中使用jsx

    最近选用的框架iview表单组件的render写法让人有点不习惯,尤其是在写比较复杂的逻辑的时候,还是感觉模板式的写法比较方便且可读性较强.而render函数除了支持配置写法外,还支持jsx的写法.由 ...