首页 > 其他分享 >LeetCode-字符串转换整数(008)

LeetCode-字符串转换整数(008)

时间:2024-12-28 11:29:16浏览次数:7  
标签:字符 charAt res 空格 读入 字符串 008 LeetCode

一.题目描述

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下:

  1. 空格:读入字符串并丢弃无用的前导空格(" "

  2. 符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。

  3. 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。

  4. 舍入:如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。

返回整数作为最终结果。

二.示例 

示例 1:

输入:s = "42"

输出:42

解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。

带下划线线的字符是所读的内容,插入符号是当前读入位置。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"42"(读入 "42")
           ^

示例 2:

输入:s = " -042"

输出:-42

解释:

第 1 步:"   -042"(读入前导空格,但忽视掉)
            ^
第 2 步:"   -042"(读入 '-' 字符,所以结果应该是负数)
             ^
第 3 步:"   -042"(读入 "042",在结果中忽略前导零)
               ^

示例 3:

输入:s = "1337c0d3"

输出:1337

解释:

第 1 步:"1337c0d3"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"1337c0d3"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"1337c0d3"(读入 "1337";由于下一个字符不是一个数字,所以读入停止)
             ^

示例 4:

输入:s = "0-1"

输出:0

解释:

第 1 步:"0-1" (当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"0-1" (当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"0-1" (读入 "0";由于下一个字符不是一个数字,所以读入停止)
          ^

示例 5:

输入:s = "words and 987"

输出:0

解释:

读取在第一个非数字字符“w”处停止。

三.提示:

  • 0 <= s.length <= 200
  • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-' 和 '.' 组成

四.解法:

方法一:遍历字符串

我们首先判断字符串是否为空,如果是,直接返回 0。

否则,我们需要遍历字符串,跳过前导空格,判断第一个非空格字符是否为正负号。

接着遍历后面的字符,如果是数字,我们判断添加该数字是否会导致整数溢出,如果会,我们根据正负号返回结果。否则我们将数字添加到结果中。继续遍历后面的字符,直到遇到非数字字符或者遍历结束。

遍历结束后,我们根据正负号返回结果。

时间复杂度 O(n),其中 n 为字符串的长度。我们只需要依次处理所有字符。空间复杂度 O(1)。

五.代码

Java代码

class Solution {
    public int myAtoi(String s) {
        // 如果字符串为 null,返回 0
        if (s == null) return 0;
        
        int n = s.length();
        // 如果字符串长度为 0,返回 0
        if (n == 0) return 0;
        
        int i = 0;
        // 跳过字符串前面的空格
        while (s.charAt(i) == ' ') {
            // 如果字符串仅包含空格,返回 0
            if (++i == n) return 0;
        }
        
        // 初始化符号变量,默认为正数
        int sign = 1;
        // 检查符号
        if (s.charAt(i) == '-') sign = -1;
        if (s.charAt(i) == '-' || s.charAt(i) == '+') ++i;
        
        // 初始化结果变量和溢出判断的标志
        int res = 0, flag = Integer.MAX_VALUE / 10;
        
        // 遍历字符串中的每个字符
        for (; i < n; ++i) {
            // 如果遇到非数字字符,跳出循环
            if (s.charAt(i) < '0' || s.charAt(i) > '9') break;
            
            // 检查是否会导致溢出
            if (res > flag || (res == flag && s.charAt(i) > '7'))
                return sign > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            
            // 更新结果
            res = res * 10 + (s.charAt(i) - '0');
        }
        
        // 返回结果,考虑符号
        return sign * res;
    }
}

注释说明
   · 空值和空字符串检查:如果输入字符串为 null 或长度为 0,直接返回 0。
   · 跳过空格:使用 while 循环跳过字符串前面的空格。
   · 符号处理:检查当前字符是否为 - 或 +,并设置符号变量 sign。
   · 结果计算:遍历字符串中的数字字符,计算结果 res。
   · 溢出检查:在每次更新 res 之前,检查是否会导致溢出。
       · 如果 res 大于 Integer.MAX_VALUE / 10 或等于 Integer.MAX_VALUE / 10 且当前字符大于 '7',则返回溢出值。
   · 返回结果:返回计算结果,乘以符号 sign。

标签:字符,charAt,res,空格,读入,字符串,008,LeetCode
From: https://blog.csdn.net/fulai00/article/details/144785419

相关文章

  • LeetCode-整数反转(007)
    一.题目描述给你一个32位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围 [−231, 231 −1] ,就返回0。假设环境不允许存储64位整数(有符号或无符号)。二.示例 示例1:输入:x=123输出:321示例2:输入:x=-......
  • java中各种字符编码通过字节向16进制的互转:UTF8|GBK|unicode 字符串<=>字节<=>16进制字符
    文章目录引言I16进制、字节、编码字符之间的转换前提16进制格式字符串‌16进制格式字符串的应用场景转换原理转换流程:字符串<=>字节<=>16进制java中编码的转换APIII其他例子TCP协议字段编码基于netty实现TCP的编码设置将16进制字符串转换为字符串......
  • C中如何实现字符串反转功能?
    在C语言中实现字符串反转功能有多种方法,包括使用循环和指针交换字符位置、递归方法、双指针法等。下面将详细介绍这些方法,并给出具体的示例代码。方法一:使用循环和指针交换字符位置这种方法是最常见且高效的方法之一。通过定义两个指针,一个指向字符串的开头,另一个指向字符串......
  • 写一个方法计算字符串长度,中文记2个,英文数字记1个
    在前端开发中,我们通常使用JavaScript来处理字符串相关的操作。以下是一个简单的JavaScript函数,用于计算字符串的长度,其中中文字符记作2个长度单位,英文和数字字符记作1个长度单位:functioncalculateStringLength(str){letlength=0;for(leti=0;i<str.length;......
  • 写一个方法难一个字符串的所有字符是否都为26个字母
    在前端开发中,你可以使用JavaScript来编写一个方法,用于检查一个字符串是否完全由26个英文字母组成。以下是一个示例方法:functionisAllLetters(str){//使用正则表达式来匹配只包含26个英文字母的字符串//^表示字符串的开始//[a-zA-Z]表示匹配任意大小写字母//+......
  • 写一个方法把如下字符串按运算符切割成数组`18x2÷9+1-6`
    在前端开发中,你可以使用JavaScript的String.prototype.split()方法和正则表达式来达到这个目的。由于你的字符串中包含多种运算符(x、÷、+、-),你可能需要使用一个稍微复杂的正则表达式来匹配这些运算符,并将字符串分割成数组。下面是一个示例函数,它接受一个字符串作为输入,并返回一......
  • 写一个正则提取字符串中的手机号码
    在前端开发中,你可以使用正则表达式来提取字符串中的手机号码。以下是一个示例的正则表达式,用于匹配中国大陆的手机号码(以1开头,第二位为3-9之间的数字,后面跟着9位数字):constregex=/1[3-9]\d{9}/g;你可以使用String.prototype.match()方法来提取字符串中匹配的手机号码。以下是......
  • 使用js写一个方法,将字符串中单词的第一个字母转换为大写
    在JavaScript中,你可以使用split(),map(),和join()方法,配合正则表达式来实现这个功能。以下是一个简单的函数,该函数接受一个字符串作为参数,并返回一个新的字符串,其中每个单词的首字母都被转换为大写:functioncapitalizeFirstLetterOfEachWord(str){returnstr......
  • LeetCode题练习与总结:键盘行--500
    一、题目描述给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。请注意,字符串 不区分大小写,相同字母的大小写形式都被视为在同一行。美式键盘 中:第一行由字符 "qwertyuiop" 组成。第二行由字符 "asdfghjkl" 组成......
  • leetcode 541.反转字符串||
    看了一圈题解,好像没有c的解法,这里简单分享一下个人的做法:题目为:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则......