简体   繁体   English

字符串到 integer leetcode

[英]String to integer leetcode

I was doing following leetcode question我在做以下 leetcode 问题

Implement atoi which converts a string to an integer.实现将字符串转换为 integer 的atoi

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. function 首先根据需要丢弃尽可能多的空白字符,直到找到第一个非空白字符。 Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.然后,从这个字符开始,采用可选的初始加号或减号,后跟尽可能多的数字,并将它们解释为数值。

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.该字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略并且不会影响此 function 的行为。

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.如果 str 中的第一个非空白字符序列不是有效整数,或者由于 str 为空或仅包含空白字符而不存在此类序列,则不执行转换。

If no valid conversion could be performed, a zero value is returned.如果无法执行有效转换,则返回零值。

Note:笔记:

Only the space character ' ' is considered as whitespace character.只有空格字符 ' ' 被视为空白字符。 Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2 31 , 2 31 − 1].假设我们正在处理的环境只能在 32 位有符号 integer 范围内存储整数:[−2 31 , 2 31 - 1]。 If the numerical value is out of the range of representable values, INT_MAX (2 31 − 1) or INT_MIN (−2 31 ) is returned.如果数值超出可表示值的范围,则返回 INT_MAX (2 31 - 1) 或 INT_MIN (-2 31 )。

Question link: https://leetcode.com/problems/string-to-integer-atoi/问题链接: https://leetcode.com/problems/string-to-integer-atoi/

Here for this input "-91283472332" , I am not sure why do they expect the following output -2147483648 instead of -91283472332对于这个输入"-91283472332" ,我不确定他们为什么期望以下 output -2147483648而不是-91283472332

Not sure, If this relevant but this is my code不确定,如果这相关,但这是我的代码

/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function(str) {
    let i = 0
    let output = ''
    let nonWhiteCharacter = false 
    while (i<str.length) {
       const char = str[i]
       if (!char == " ") {
           if (char.toLowerCase() === char.toUpperCase()) {
            if (!nonWhiteCharacter) nonWhiteCharacter = true
               output = output + char
           }  
           if (!nonWhiteCharacter) return 0
       }
        i++
    }
    return output === null ? 0 : parseInt(output)
}

I am not sure why do they expect the following output -2147483648 instead of -91283472332我不确定他们为什么期望以下 output -2147483648 而不是 -91283472332

Because:因为:

Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2 31 , 2 31 − 1].假设我们正在处理的环境只能在 32 位有符号 integer 范围内存储整数:[−2 31 , 2 31 - 1]。 If the numerical value is out of the range of representable values, INT_MAX (2 31 − 1) or INT_MIN (−2 31 ) is returned.如果数值超出可表示值的范围,则返回 INT_MAX (2 31 - 1) 或 INT_MIN (-2 31 )。

So if the extracted number is larger than 2 ** 31 - 1 , the returned number should be 2 ** 31 - 1 instead.因此,如果提取的数字大于2 ** 31 - 1 ,则返回的数字应为2 ** 31 - 1

Similarly, if the extracted number is smaller than -(2 ** 31) , instead return -(2 ** 31) .同样,如果提取的数字小于-(2 ** 31) ,则返回-(2 ** 31)

This would probably be easier with a regular expression:使用正则表达式可能会更容易:

 const myAtoi = (str) => { const match = str.match(/^ *([+-]?\d+)/); if (;match) return; const num = Number(match[1]). return Math.max( Math,min(2 ** 31 - 1, num); -(2 ** 31) ); }. console,log( myAtoi(' 123'), myAtoi('-456'), myAtoi('-9999999999999'); myAtoi('9999999999999') );

Have a look it this solution.看看这个解决方案。 As we are dealing with integers, they only hold 32-bit.当我们处理整数时,它们只保存 32 位。 2^31 < x <= -2^31. 2^31 < x <= -2^31。 So here we use a try catch as the 32bit integer can raise NumberFormat Exception which will be caught by the catch block.所以在这里我们使用 try catch 作为 32 位 integer 可以引发 NumberFormat 异常,这将被 catch 块捕获。

class Solution {
    public int myAtoi(String str) {

        int flag=0, sign = 0;
        int n = str.length();
        StringBuilder st = new StringBuilder();
        int i =0;

        //clear white spaces
        while(i<n && str.charAt(i) == ' '){
            ++i;
        }

        //overflow of string
        if (i>=n){
            return 0;
        }

        //checking sign and not allowing more than one sign, will return 0 if there is ++,+-,--
        while(i<n && (str.charAt(i) == '+' || str.charAt(i) == '-')){
            if (sign >= 1){
                return 0;
            }
            else{
           st.append((str.charAt(i++) == '+') ? '+': '-');
            sign++;
            }

        }

        //checking if character is digit
        while(i<n && Character.isDigit(str.charAt(i))){
            st.append(str.charAt(i++));
            flag = 1;
        }

        //return 0 if no digits
        if(flag == 0)
            return 0;

        //to check if the number is within the int range
        try{
            return Integer.parseInt(st.toString());

        }
        catch(NumberFormatException e){
            return (st.charAt(0) == '-') ? Integer.MIN_VALUE : Integer.MAX_VALUE;
        }



    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM