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

字符串加减转数字java_剑指Offer解题报告(Java版)——字符串转换为数字 49

引言

STOI是很常见的一道题,leetcode上也有,字符串转换为数字一般都会有现成的函数去实现这样的功能,但有时候需要我们理解其中的具体实现,因为虽然是个很常见的问题,但实际上需要考虑的问题还是很多的,尤其是corner case的处理,而这类问题一般要考虑两点:一点是符号,另外一点是越界

分析问题

如果字符串前面有空格怎么办,一般来说中间是没有空格的,但是前后可能有空格,所以我们首先需要去掉多余的空格字符,用到trim函数

然后就是字符串中有可能第一个位置上有符号,比如负号,对于正数,有可能有,有可能没有,这种问题应该怎么去解决呢,其实如果有符号的话也肯定是在第一个字符处,所以我们只要判断一下第一个字符是不是负号,如果是,我们需要勇哥标志标记一下,如果不是负号而是正号,那么直接跳过就行,如果没有符号,那么从第一个数开始读取

另外就是有可能前面的字符串都是乖乖的是数字,中间来个异常字符,那么我们这个时候需要做的就要分情况了,第一我们可以保留前面的数字,舍弃异常字符后面的东西,第二就是我们直接简单粗暴的返回错误

还有就是字符串表示的数字有可能很大,有可能越界,那么我们应该怎么办,可以输出,越界了,也可以返回最接近的整数

另外用个boolean值表示是否正常完成,而对于一些异常的处理,可以因人而异,因要求而异了

解决问题

static boolean finished = false;

public int atoi(String str) {

str=str.trim();

int i = 0;

boolean minus = false;

if (str.charAt(0) == '-') {

minus = true;

i++;

} else if (str.charAt(0) == '+') {

i++;

}

long MIN_VALUE = Integer.MIN_VALUE;

long MAX_VALUE = Integer.MAX_VALUE;

long num = 0;

for (; i < length && !finished; i++) {

char c = str.charAt(i);

if (c >= '0' && c <= '9') {

num *= 10;

num += c - '0';

} else {

num=0;

break;

}

if (minus && 0 - num < MIN_VALUE) {

return Integer.MIN_VALUE;

}

if (!minus && num > MAX_VALUE) {

return Integer.MAX_VALUE;

}

}

if (i==length) {

finished = true;

}

return minus ? new Long(0 - num).intValue() : new Long(num).intValue();

}

相关文章:

  • Java txt 下拉刷新_「小程序JAVA实战」小程序页面的上拉下拉刷新(50)
  • Java语言西安交大高起专_2018年西安交大网络学院高起专/本英语入学考试复习题...
  • php 生成不了zip文件怎么打开吗,PHP生成压缩包,不带根目录 | 学步园
  • php变量持有对象的引用,我对PHP变量引用、对象引用的理解
  • php 自动填写表单,PHP自动生成表单代码分享
  • 记事本底部的java切换,如何使用java操作记事本(转)
  • php类调用类外变量吗,如何调用类外的变量
  • matlab中单相整流器,一种新型单相脉冲整流器的MATLAB仿真研究
  • matlab中支持向量机网格,MATLAB中SVM(支持向量机)的用法
  • mysql出现帮助,MySQL之帮助的使用
  • 不会matlab下载,下载的用MATLAB实现的DTW算法,不会用,跪求大神帮忙
  • mysql序列号重置,当我们更改小于当前序列号的AUTO_INCREMENT值时,MySQL将返回什么?...
  • mysql聚合函数详解,MySQL常用聚合函数详解
  • php 年月日自动更新,php生成年月日下载列表的方法
  • java 去掉字符串中的注释,Python删除Java源文件中全部注释的实现方法
  • $translatePartialLoader加载失败及解决方式
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JAVA 学习IO流
  • Java精华积累:初学者都应该搞懂的问题
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Redis 懒删除(lazy free)简史
  • SQL 难点解决:记录的引用
  • vue-cli3搭建项目
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 阿里云应用高可用服务公测发布
  • 从0到1:PostCSS 插件开发最佳实践
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 聚簇索引和非聚簇索引
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 微服务入门【系列视频课程】
  • 为什么要用IPython/Jupyter?
  • k8s使用glusterfs实现动态持久化存储
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​Spring Boot 分片上传文件
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #NOIP 2014#Day.2 T3 解方程
  • (1) caustics\
  • (1)Nginx简介和安装教程
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (20050108)又读《平凡的世界》
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (编译到47%失败)to be deleted
  • (分布式缓存)Redis分片集群
  • (附源码)ssm高校实验室 毕业设计 800008
  • .gitignore
  • .naturalWidth 和naturalHeight属性,
  • .NET Core Web APi类库如何内嵌运行?
  • .Net Web窗口页属性
  • .net 设置默认首页
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net中我喜欢的两种验证码
  • 。Net下Windows服务程序开发疑惑