简体   繁体   中英

String to integer leetcode

I was doing following leetcode question

Implement atoi which converts a string to an integer.

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. 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.

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.

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]. If the numerical value is out of the range of representable values, INT_MAX (2 31 − 1) or INT_MIN (−2 31 ) is returned.

Question link: 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

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

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]. If the numerical value is out of the range of representable values, INT_MAX (2 31 − 1) or INT_MIN (−2 31 ) is returned.

So if the extracted number is larger than 2 ** 31 - 1 , the returned number should be 2 ** 31 - 1 instead.

Similarly, if the extracted number is smaller than -(2 ** 31) , instead return -(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. 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.

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;
        }



    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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