力扣LeetCode算法题 第8题-字符串转换整数 (atoi)

news2024/11/24 23:03:08

以上为题目要求:

/**
 * @params Leetcode_test007
 * @return Leetcode_test007
 * @Author bigeZhong
 * @disc
 *
 *请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
 *
 * 函数myAtoi(string s) 的算法如下:
 *
 * 读入字符串并丢弃无用的前导空格
 * 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
 * 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
 * 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
 * 如果整数数超过 32 位有符号整数范围 [−2^31, 2^31− 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
 * 返回整数作为最终结果。
 * 注意:
 *
 * 本题中的空白字符只包括空格字符 ' ' 。
 * 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
 *
 *
 */

 首先的话,我们需要先理解题目意思,就是从一大串字符串中提取出有效的数字,这时候我们就要想到一个专门提取字符串的一个方法

使用character中的isdigit去提取有效数字

那么,我的解题思路是以下几点:

1.该函数的实现思路如下:
2.去除字符串前导空格;
3.判断符号位,如果有符号位则记录符号;
4.转换数字,每次将结果值乘以10再加上当前位的数字,判断是否溢出;
5.返回结果值乘以符号位。

附上我写的代码以及思路:

public static int myAtoi(String s) {
        //1.去除字符串前导空格,涉及对字符串的使用
        int index_i = 0;
        //先判断去除字符串里面的空格,并返回下标
        while ((index_i < s.length()) && s.charAt(index_i) == ' '){
            index_i++;
        }

        //2.判断符号位,如果有符号位则记录符号;
        int sign =1;
        if (index_i<s.length() && (s.charAt(index_i) == '+' || s.charAt(index_i) =='-')){
            sign = s.charAt(index_i) == '+'?1:-1;
            index_i++;
        }

        //3.使用character中的isdigit去提取有效数字
        int result = 0;
        while (index_i<s.length() && Character.isDigit(s.charAt(index_i)) ){
            int digit = s.charAt(index_i) - '0';
            // 判断是否溢出
            if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && digit > 7)) {
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            result = result * 10 + digit;
            index_i++;
        }

        return result*sign;
    }

之后查看了下在leetcode中的效果

附上全部的代码,可以粘贴使用:

package com.zhm.test;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * @params Leetcode_test007
 * @return Leetcode_test007
 * @Author bigeZhong
 * @disc
 *
 *请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
 *
 * 函数myAtoi(string s) 的算法如下:
 *
 * 读入字符串并丢弃无用的前导空格
 * 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
 * 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
 * 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
 * 如果整数数超过 32 位有符号整数范围 [−2^31, 2^31− 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
 * 返回整数作为最终结果。
 * 注意:
 *
 * 本题中的空白字符只包括空格字符 ' ' 。
 * 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
 *
 *
 */
public class Leetcode_test008 {
    /*
    该函数的实现思路如下:
    去除字符串前导空格;
    判断符号位,如果有符号位则记录符号;
    转换数字,每次将结果值乘以10再加上当前位的数字,判断是否溢出;
    返回结果值乘以符号位。
    */
    public static int myAtoi(String s) {
        //1.去除字符串前导空格,涉及对字符串的使用
        int index_i = 0;
        //先判断去除字符串里面的空格,并返回下标
        while ((index_i < s.length()) && s.charAt(index_i) == ' '){
            index_i++;
        }

        //2.判断符号位,如果有符号位则记录符号;
        int sign =1;
        if (index_i<s.length() && (s.charAt(index_i) == '+' || s.charAt(index_i) =='-')){
            sign = s.charAt(index_i) == '+'?1:-1;
            index_i++;
        }

        //3.使用character中的isdigit去提取有效数字
        int result = 0;
        while (index_i<s.length() && Character.isDigit(s.charAt(index_i)) ){
            int digit = s.charAt(index_i) - '0';
            // 判断是否溢出
            if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && digit > 7)) {
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            result = result * 10 + digit;
            index_i++;
        }

        return result*sign;
    }


    public static void main(String[] args) {
        String s1 = "42";
        String s2 = "     -42";
        String s3 = "4193 with words";
        String s4 = "gfsdgsdfgh-6456793 with words";
        String s5 = "+-12";

        System.out.println(myAtoi(s1));
        System.out.println("=============");
        System.out.println(myAtoi(s2));
        System.out.println("=============");
        System.out.println(myAtoi(s3));
        System.out.println("=============");
        System.out.println(myAtoi(s4));
        System.out.println("=============");
        System.out.println(myAtoi(s5));
        System.out.println("===111==========");

    }
}

 

以上为全部的代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java实现打包下载

背景&#xff1a;项目中下载功能单个文件正常下载多个文件或者包含文件夹打压缩包下载 上代码 controller RestController RequestMapping("/file") public class FileController {RequestMapping(value "/downloadFilePack", method RequestMethod.G…

SpringCloud 规则持久化

SpringCloud 规则持久化 文章目录 SpringCloud 规则持久化1 规则持久化2 规则持久化方案2.1 阿里云 Ahas[最方便/付费]2.2 在 Nacos Server 配置规则, 完成持久化 -官方推荐2.3 将规则持久化到本地文件, 定时同步 3 Nacos Server 配置中心-规则持久化实例 1 规则持久化 **规则…

MySQL压缩版本安装

MySQL压缩版本安装 首先分享mysql-8.0.23版本的压缩包&#xff0c;请有需要的朋友自取。 链接&#xff1a;https://pan.baidu.com/s/1h46ZCkGLbikhDOu5_0p2nw 提取码&#xff1a;wwd2 1、解压压缩包 1、将下载的压缩包放置到安装的位置后并解压&#xff0c;笔者将文件夹放到…

WPF BUG汇总:WPF Debug运行是 实时可视化树无效,无法查看代码

文章目录 往期回顾前言问题解决方案 往期回顾 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github 项目Demo运行 前言 最近打算去深圳工作&#xff0c;投了几个简历之后发现深圳的C#方向上&#xff0c;WPF招聘的比较多。这里介绍一下&#xff0c;工业计算机&…

ChatGLM-6B的windows本地部署使用

ChartGPT最近特别火&#xff0c;但是收费&#xff0c;而且国内访问不太方便&#xff0c;所以找了个类似的进行学习使用 ChatGLM-6B&#xff0c;开源支持中英文的对话大模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有62亿参数&#xff0c;简单说非常…

SpringCloud高级应用-Gateway

Dubbo SpringCloud高级应用 1. SpringCloud技术栈1.1 SpringCloud技术栈1.2 SpringCloud经典技术介绍1.3 SpringCloud项目场景 2. SpringCloud Gateway2.1 Gateway工作原理2.2 Gateway路由2.2.1 业务说明2.2.2 基于配置路由设置2.2.3 基于代码路由配置2.2.4 Gateway-Predicate2…

数据库的增删改查(2)

1、数据库约束 关系型数据库的一个重要功能 主要作用是保证数据的完整性&#xff0c;也就是数据的正确性&#xff08;数据本身是正确的&#xff0c;关联关系也是正确的&#xff09; 人工检查数据的完整性的工作量非常的大&#xff0c;在数据表定义一些约束&#xff0c;那数据…

Shamir 秘密共享、GMW和BGW方案

一、Shamir秘密共享 Shamir秘密共享方案是一种将秘密拆分成多份并分配给多个参与者保存&#xff0c;只有在满足特定条件下才能恢复原始秘密的密码学方案。它具有良好的容错性、加法同态性和无条件安全性等特点。 具体地&#xff0c;Shamir秘密共享方案可以概括为以下步骤&…

Protobuf数据类型

enum类型 语法⽀持我们定义枚举类型并使⽤。在.proto⽂件中枚举类型的书写规范为&#xff1a; 枚举类型名称&#xff1a; 使⽤驼峰命名法&#xff0c;⾸字⺟⼤写。例如&#xff1a; MyEnum 常量值名称&#xff1a; 全⼤写字⺟&#xff0c;多个字⺟之间⽤连接。例如&#xff1a…

【嵌入式烧录/刷写文件】-2.9-Intel Hex文件的地址对齐Address Alignment

案例背景(共5页精讲): 对一个Intel Hex文件&#xff0c;进行地址对齐Address Alignment。 目录 1 为什么要进行“地址对齐Address Alignment” 1.1 “对齐长度”的选择 2 使用Vector HexView工具对Hex文件进行“地址对齐Address Alignment” 2.1 “自动”完成“地址对齐Ad…

【JavaEE】Cookie与Session的前后端交互-表白墙登录设计

【JavaEE】Cookie与Session的前后端交互-表白墙登录设计 文章目录 【JavaEE】Cookie与Session的前后端交互-表白墙登录设计1. Cookie与Session1.1 后端doPost的实现1.1.1 隐藏的全局变量1.1.2 获取请求对应的HttpSession对象1.1.3 约定前后端交互方式1.1.4 验证用户名与密码是否…

你不知道的Bing聊天机器人:7个惊人的用途!

导读&#xff1a;以下是我总结的有用的方法&#xff0c;可以利用AI聊天机器人让您的生活更轻松。 本文字数&#xff1a;1600&#xff0c;阅读时长大约&#xff1a;10分钟 生成式AI工具可以用非常多的方式使你的日常生活更轻松。 AI聊天机器人在编程、写作等方面表现出色&#…

JVM入门:官网了解JVM、Java源文件运行过程、什么是类加载器、Java的类加载机制的三种方式、Tomcat的自定义类加载器

JVM入门&#xff1a;官网了解JVM、Java源文件运行过程、什么是类加载器、Java的类加载机制的三种方式、Tomcat的自定义类加载器 通过官网了解JVM官网jdk8结构图什么是JVM查看官网Java语言和虚拟机规范 Java源文件运行过程1.Java源文件经过Javac编译成字节码文件如何手动编译一个…

Java如何实现去重?这是在炫技吗?

大家好&#xff0c;我3y啊。由于去重逻辑重构了几次&#xff0c;好多股东直呼看不懂&#xff0c;于是我今天再安排一波对代码的解析吧。austin支持两种去重的类型&#xff1a;N分钟相同内容达到N次去重和一天内N次相同渠道频次去重。 Java开源项目消息推送平台&#x1f525;推送…

高性能服务器为什么需要内存池?

C/C程序为什么比起其它语言开发的程序效率要高&#xff0c;一个很重要的原因就是可以直接操作内存&#xff0c;今天就来讲讲为什么需要内存池的技术。 从一个示例开始 先看下面两段代码&#xff0c;都是去重复的创建和删除对象0x5FFFFF次&#xff0c;他们的执行后的效率怎么样…

DIP第7章知识点

文章目录 7.3 相关7.5 基图像7.6 傅里叶相关变换7.6.1 离散哈特利变换7.6.3 离散正弦变换 DIP的其他章节都好复习&#xff0c;唯独就这个第7章小波变换。复习起来十分头大&#xff0c;所以我开始写他的课后题&#xff0c;雾。 7.3 相关 已知两个连续函数 f ( x ) f(x) f(x) …

一篇博客教会你怎么使用Docker安装Redis

文章目录 1、搜索镜像2、拉取镜像3、下载配置文件4、修改配置文件5、启动容器 今天我们学习使用 Docker 安装 Redis。 1、搜索镜像 docker search redis2、拉取镜像 docker pull redis3、下载配置文件 wget http://download.redis.io/redis-stable/redis.conf下载的配置文件…

云原生Docker容器管理

docker容器相当于一个进程&#xff0c;性能接近于原生&#xff0c;几乎没有损耗&#xff1b; docker容器在单台主机上支持的数量成百上千&#xff1b; 容器与容器之间相互隔离&#xff1b; 镜像是创建容器的基础&#xff0c;可以理解镜像为一个压缩包 docker容器的管理 容器…

彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法

原本这篇文章是打算叫「假如我是彩票系统开发者」&#xff0c;但细想一下&#xff0c;如果在文章中引用太多的 JavaScript 的话&#xff0c;反而不是那么纯粹&#xff0c;毕竟也只是我的一厢情愿&#xff0c;彩票开发也不全如本文所讲&#xff0c;有所误导的话便也是得不偿失了…

理解 Java 关键字 final

原文链接 理解 Java 关键字 final final可以用来干什么 final是Java中非常常见的一个关键字&#xff0c;可以说每天都在使用它&#xff0c;虽然常见&#xff0c;但却也不见得都那么显而易见&#xff0c;今天就来研究一下final&#xff0c;以加深对它的理解和更合理的运用。 修…