0
点赞
收藏
分享

微信扫一扫

【AI绘画】Midjourney前置指令/describe、/shorten详解

题目来源

8. 字符串转换整数 (atoi) - 力扣(LeetCode)

 

题目描述

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

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

  1. 空格:读入字符串并丢弃无用的前导空格(" ")
  2. 符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
  3. 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
  4. 舍入:如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。

返回整数作为最终结果。

示例 1

示例 2

示例 3

示例 4

示例 5

提示

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

题目解析

本题可以分为两部分逻辑:

  1. 读入最终结果数字串
  2. 判断最终结果数字串是否超出 int 范围

读入最终结果数字串逻辑如下:

  1. 首先,跳过前导空格
  2. 接着,读入最终结果的符号部分 sign,可能没有符号,此时默认为正数
  3. 最后,读入最终结果的数字部分 num,可能含有前导0,但是不影响结果

判断一个数字串是否超出 int 范围,我们可以从高位到低位,依次读取该数字串的每个字符 c,将计算结果记录进 res 中,res初始为0:

按上面公式,先计算进res的高位数字后续会不断 *10,抬高位序。

如果计算过程中,发现 res 超出了 int 范围(一步一步计算的过程,绝对不会超出 long 范围,因此 res 可以定义为 long 类型),则停止计算,返回对应 int 边界值。

更多细节逻辑,请看代码实现。

C源码实现

int myAtoi(char* s) {
int i = 0;
while (i < strlen(s) &= ' ') { // 跳过无用的前导空格
i++;
}

int sign = 1; // sign录入最终结果的符号部分, 1表示正, -1表示负, 默认为正
if (i < strlen(s) && (s[i] == '+' || s[i] == '-')) { // 如果有开头+或-号, 则更新sign信息
sign = s[i] == '-' ? -1 : 1;
i++;
}

char num[201] = {'\0'}; // num录入最终结果的数字部分
int num_size = 0;
for (; i < strlen(s); i++) {
if (s[i] >= '0' && s[i] <= '9') {
num[num_size++] = s[i];
} else {
break;
}
}

// 判断一个数值是否超过int范围
long res = 0;
for (int j = 0; j < num_size; j++) {
res = res * 10 + (num[j] - '0');

if (res * sign >= INT_MAX) {
return INT_MAX;
}

if (res * sign <= INT_MIN) {
return INT_MIN;
}
}

return (int)res * sign;
}

C++源码实现

class Solution {
public:
int myAtoi(string s) {
int i = 0;
while (i < s.length() &= ' ') { // 跳过无用的前导空格
i++;
}

int sign = 1; // sign录入最终结果的符号部分, 1表示正, -1表示负, 默认为正
if (i < s.length() &&
(s[i] == '+' || s[i] == '-')) { // 如果有开头+或-号, 则更新sign信息
sign = s[i] == '-' ? -1 : 1;
i++;
}

string num; // num录入最终结果的数字部分
for (; i < s.length(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
num += s[i];
} else {
break;
}
}

// 判断一个数值是否超过int范围
long res = 0;
for (int j = 0; j < num.length(); j++) {
res = res * 10 + (num[j] - '0');

if (res * sign >= INT_MAX) {
return INT_MAX;
}

if (res * sign <= INT_MIN) {
return INT_MIN;
}
}

return (int) res * sign;
}
};

 

Java源码实现

class Solution {
public int myAtoi(String s) {
int i = 0;
while (i < s.length() && s.charAt(i) == ' ') { // 跳过无用的前导空格
i++;
}

int sign = 1; // sign录入最终结果的符号部分, 1表示正, -1表示负, 默认为正
if (i < s.length() && (s.charAt(i) == '+' || s.charAt(i) == '-')) { // 如果有开头+或-号, 则更新sign信息
sign = s.charAt(i) == '-' ? -1 : 1;
i++; // 跳过符号
}

StringBuilder num = new StringBuilder(); // num录入最终结果的数字部分
for (; i < s.length(); i++) {
char c = s.charAt(i);

if (c >= '0' '9') {
num.append(c);
} else {
break;
}
}

// 判断一个数值是否超过int范围
long res = 0;
for (int j = 0; j < num.length(); j++) {
res = res * 10 + (num.charAt(j) - '0');

if (res * sign >= Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}

if (res * sign <= Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
}

return (int) res * sign;
}
}

 

Python源码实现

class Solution(object):
def myAtoi(self, s):
"""
:type s: str
:rtype: int
"""

i = 0
while i < len(s) and s[i] == ' ': # 跳过无用的前导空格
i += 1

sign = 1 # sign录入最终结果的符号部分, 1表示正, -1表示负, 默认为正
if i < len(s) and (s[i] == '+' or s[i] == '-'): # 如果有开头+或-号, 则更新sign信息
sign = -1 if s[i] == '-' else 1
i += 1

num = "" # num录入最终结果的数字部分
while i < len(s):
if '9' >= s[i] >= '0':
num += s[i]
else:
break
i += 1

INT_MAX = pow(2, 31) - 1
INT_MIN = -pow(2, 31)

# 判断一个数值是否超过int范围
res = 0
for j in range(len(num)):
res = res * 10 + int(num[j])

if res * sign >= INT_MAX:
return INT_MAX

if res * sign <= INT_MIN:
return INT_MIN

return res * sign

JavaScript源码实现

/**
* @param {string} s
* @return {number}
*/

var myAtoi = function (s) {
let i = 0;
while (i < s.length &= " ") {
// 跳过无用的前导空格
i++;
}

let sign = 1; // sign录入最终结果的符号部分, 1表示正, -1表示负, 默认为正
if (i < s.length && (s[i] == "+" || s[i] == "-")) {
// 如果有开头+或-号, 则更新sign信息
sign = s[i] == "-" ? -1 : 1;
i++;
}

let num = ""; // num录入最终结果的数字部分
for (; i < s.length; i++) {
if (s[i] >= "0" && s[i] <= "9") {
num += s[i];
} else {
break;
}
}

const INT_MAX = Math.pow(2, 31) - 1;
const INT_MIN = -Math.pow(2, 31);

// 判断一个数值是否超过int范围
let res = 0;
for (let j = 0; j < num.length; j++) {
res = res * 10 + parseInt(num[j]);

if (res * sign >= INT_MAX) {
return INT_MAX;
}

if (res * sign <= INT_MIN) {
return INT_MIN;
}
}

return res * sign;
};
举报

相关推荐

0 条评论