当前位置: 首页 > news >正文

剑指Offer系列(java版,详细解析)67.把字符串转化成整数

题目描述

剑指 Offer 67. 把字符串转换成整数

难度中等72收藏分享切换为英文接收动态反馈

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

测试用例

  • 功能测试(输入的字符串表示整数、负数和0)
  • 边界值测试(最大的正整数;最小的负整数)
  • 特殊输入测试(输入的字符串为空指针;输入的字符串为空字符串;输入的字符串中有非数字字符等)

题目考点

  • 考察应聘者的沟通能力,毕竟有很多细节处理。
  • 考察应聘者思维的全面性。

解题思路

参照Integer.valueOf(string)方法

这道题虽然简单,但是很容易写出不全面的代码,这时候就需要考虑测试用例了,主要解决如下问题:

  1. 空指针、空串
  2. 整数溢出
  3. 非法字符
  4. 首字符为+、-

参考解题

class Solution {
    public int strToInt(String str) {
        char[] c = str.trim().toCharArray();
        if(c.length == 0) return 0;
        int res = 0, bndry = Integer.MAX_VALUE / 10;
        int i = 1, sign = 1;
        if(c[0] == '-') sign = -1;
        else if(c[0] != '+') i = 0;
        for(int j = i; j < c.length; j++) {
            if(c[j] < '0' || c[j] > '9') break;
            if(res > bndry || res == bndry && c[j] > '7') return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            res = res * 10 + (c[j] - '0');
        }
        return sign * res;
    }
}

相关文章:

  • 剑指Offer系列(java版,详细解析)68.树中两个节点的最低公共祖先
  • Go语言fmt.Sprintf(格式化输出)
  • Go 面试系列:Go interface中nil的比较问题
  • Go 面试系列: new 和 make有什么不同之处呢?
  • Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?
  • 什么是读、写扩散?
  • 一文搞定权限设计模型(RBAC,ABAC)超详细图文解析
  • 一文搞定权限管理!授权、鉴权超详细解析
  • Go 中的 JSON如何序列化和反序列化?来看看go的包怎么实现!
  • Go中如何比较两个json?深度优先搜索解决,超详细代码!
  • Go语言实现枚举方法,const和iota结合轻松实现
  • Go msgp序列化使用详解!比Json更快!面试时吊打面试官!
  • 缓存击穿了怎么办?使用singleflight轻松解决!
  • Go中优雅的获取Map元素的多种方法
  • Go中的nil是是什么?和java的null有区别吗?
  • [数据结构]链表的实现在PHP中
  • angular2 简述
  • Apache Pulsar 2.1 重磅发布
  • django开发-定时任务的使用
  • ES6之路之模块详解
  • JAVA_NIO系列——Channel和Buffer详解
  • Java|序列化异常StreamCorruptedException的解决方法
  • Logstash 参考指南(目录)
  • PaddlePaddle-GitHub的正确打开姿势
  • RxJS: 简单入门
  • Service Worker
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • swift基础之_对象 实例方法 对象方法。
  • ucore操作系统实验笔记 - 重新理解中断
  • 普通函数和构造函数的区别
  • 如何利用MongoDB打造TOP榜小程序
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 小程序测试方案初探
  • 移动端解决方案学习记录
  • 鱼骨图 - 如何绘制?
  • gunicorn工作原理
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ${factoryList }后面有空格不影响
  • (07)Hive——窗口函数详解
  • (C++17) optional的使用
  • (C语言)逆序输出字符串
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (八)Spring源码解析:Spring MVC
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (一)基于IDEA的JAVA基础10
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • **python多态
  • .htaccess配置重写url引擎
  • .Mobi域名介绍