From 294f16e5da4204dc4d25b45605c496ca1d6ad635 Mon Sep 17 00:00:00 2001 From: Aerex Date: Sat, 30 Nov 2019 14:38:49 -0500 Subject: [PATCH] feat: Added solution for atoi --- string-to-integer-aoi/js/index.js | 151 ++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 string-to-integer-aoi/js/index.js diff --git a/string-to-integer-aoi/js/index.js b/string-to-integer-aoi/js/index.js new file mode 100644 index 0000000..629cc66 --- /dev/null +++ b/string-to-integer-aoi/js/index.js @@ -0,0 +1,151 @@ +/* + * 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: [−231, 231 − 1]. If the numerical value is out of the range of representable values, INT_MAX (231 − 1) or INT_MIN (−231) is returned. + +*/ +const assert = function(condition, message) { + if(!condition) { + console.error(` ${message}`); + } + console.log(` ${message}`); +} + +/** + * @param {string} str + * @return {number} + */ +const myAtoi = function(str) { + const INT_MAX = Math.pow(2,31) -1; + const INT_MIN = Math.pow(2,31)* -1; + let trimmedStr = str.trim(); + + const valid = ['0', '1', '2','3','4','5','6','7','8','9', '-', '+']; + const signs = ['-', '+']; + + if( + !valid.includes(trimmedStr[0]) + || (trimmedStr.length === 1&& signs.includes(trimmedStr[0])) + || (signs.includes(trimmedStr[0]) && signs.includes(trimmedStr[1])) + || (signs.includes(trimmedStr[0]) && !valid.includes(trimmedStr[1])) + ) { + return 0; + } + + + const decimalIndx = str.indexOf('.'); + + if (decimalIndx > -1){ + trimmedStr = str.substring(0, decimalIndx); + } + + const isNeg = trimmedStr[0] === '-'; + const isPlus = trimmedStr[0] === '+'; + + + + const queue = []; + const list = trimmedStr.split(''); + for(let i = 0; i < list.length; i++){ + const char = list[i]; + if(!valid.includes(char) ||(signs.includes(char) && i > 0)) { + break; + } + if(valid.includes(char)){ + queue.push(char); + } + } + + if(isNeg){ + queue.shift(); + } + if (isPlus){ + queue.shift(); + } + let integer = parseInt(queue.pop(), 10); + while(queue.length){ + let multipler = queue.length; + let char = queue.shift(); + integer += (Math.pow(10, multipler)* parseInt(char, 10)); + } + + if(isNeg){ + integer= integer*-1; + } + + if (integer >INT_MAX){ + return INT_MAX; + } + if (integer < INT_MIN){ + return INT_MIN; + } + + return integer; + +}; + +/* + * Test Case 1 + * Input: "42" + * Output: 42 + */ +x = '42'; +sol = 42; +assert(myAtoi(x) === sol, 'Output: 42'); +/* Explanation: The first non-whitespace character is '-', which is the minus sign. + * Then take as many numerical digits as possible, which gets 42. + */ + +/* Test Case 2 + * Input: " -42" + * Output: -42 + */ +x = " -42"; +sol = -42; +assert(myAtoi(x) === sol, 'Output: -42'); + +/* Test Case 3 + * Input: "4193 with words" + * Output: 4193 + */ +x = '4193 with words'; +sol = 4193; +assert(myAtoi(x) === sol, 'Output: 4193'); +/* Explanation: Conversion stops at digit '3' as the next character is not a numerical digit. +*/ + +/* Test Case 4 + * Input: "words and 987" + * Output: 0 + */ +x = 'words and 987'; +sol = 0; +assert(myAtoi(x) === sol, 'Output: 0'); +/* Explanation: The first non-whitespace character is 'w', which is not a numerical digit or a +/- sign. + * Therefore no valid conversion could be performed. + */ + +/* Test Case 5 + * Input: "-91283472332" + * Output: -2147483648 + */ + +x = '-91283472332'; +sol = -2147483648; +assert(myAtoi(x) === sol, 'Output: -2147483648'); +/*Explanation: The number "-91283472332" is out of the range of a 32-bit signed integer. + * Thefore INT_MIN (−231) is returned. +*/