📣 Calling experienced devs and recent interviewees! Join the "Coding Problem Interview Series" to help code newbies tackle interview questions assessing problem-solving skills, algorithmic knowledge, and implementation of sorting, string manipulation, and data structure algorithms.
Share your expertise and insights! Pleas share multiple perspectives and tips for standout answers!
Today's question is:
In an interview setting, how would you approach converting a String to an integer (similar to the atoi() function)?
Follow the CodeNewbie Org and #codenewbie for more discussions and online camaraderie!

Top comments (29)
Troll answer (JS):
I think this needs a few self-imposed rules, such as not using any built-in language features or APIs to do the conversion.
lol. let me do all your work in a single line:
function atoi(str) {
return +str
}
@urielbitton I still prefer my one-liner
const atoi = parseInt, because+strdoesn't fulfil the spec (might return a non-integer) 😉True,
+'...'behaves similar toNumber, so it'll convert floats as well.@lionelrowe + quite literally replaces parseInt in 99% or perhaps 100% of cases in javascript.
Not if you only want integers...
@urielbitton It depends what your use case is. I usually use
Number(str)instead of+stras it's more explicit, plus it can be passed as a callback to array functions (['1', '2', '3'].map(Number) => [1, 2, 3]). I usually only useparseIntif I want to parse in a radix other than 10, e.g. parsing hex strings (parseInt('ff', 16) => 255), or if I want the result to be truncated (parseInt('16.9')). And I use=> 16
parseFloatwhere I want to ignore a unit at the end, e.g.parseFloat('99.9%') => 99.9.just add .toFixed(0)
just add .toFixed(0) ...
OK, that potentially covers 1 of the 4 use cases I mentioned, but it doesn't even work, as
toFixedconverts it back to a string...Sure, you could re-convert to a number, but at that point you're degrading performance and complicating your code just to avoid using
parseInt, a function that already exists natively in the language for that specific purpose.The second answer is somehow same idea with the first answer but then the first one is much cleaner and more efficient in any ways. Solution they are looking for is maybe to parse manually, taking care of the cases, char to integer… very basic.
Rust (be gentle, I'm learning 😅)
Elm + Parser combinators:
You begin with the
Integerdata structure.The
intPparser is a recipe of how you can generate anIntegerinstance from a raw string, step by step.Once you have filled all the holes of the data structure, you can then process it and generate the integer value (with the
applySignfunction).The
atoifunction wraps the execution of the parser and returns theMaybe Intvalue.This approach is closer to intermediate/advanced than to newbies, but this is how parsing is done in a functional style.
If you want to play with the exercise: ellie-app.com/nm6g8LCw37za1
I love reading Elm code even though I find it hard to understand, it's kinda brain-bending in a good way!
I noticed you're using
String.toIntthough, so you could replace the wholeatoiimplementation with that, as it already handles+and-:You are absolutely right!
String.toIntalready does the job. Wouldn't that be considered cheating during a job interview, though? :)Parser combinators are an extra brain-bending feature within the language. But it is so powerful that it's worth learning if you want to parse stuff and RegEx falls too short for the job.
JAVA
(still learning, so forgive my not so neat code😅)
Works perfectly, at least for well-formed input. For malformed input,
Solution#.myAtoi('abc123')gives0, andSolution#.myAtoi('123abc')gives123, which is a reasonable thing to do if you want parsing to be lenient (JS'sparseIntworks similarly, except it returnsNaNinstead of0where the input begins with an unparseable char).I don't think it makes much sense to have
numbe adoubleand then cast it to anintwhen returning it, though. To improve performance if nothing else, it'd be better to declare it as anint, then you can remove all the type casts.The only possible drawback is that it changes the behavior for values that overflow the max int value: with purely int types, you get wrapping (2147483647 + 1 = -2147483648), whereas if using a double internally, you get saturation (2147483647 + 1 = 2147483647). I don't think either one is strictly more/less correct than the other, though.
Hey lionel,
I just copied the copied that I wrote for the same questions in leetcode.😅
My code is logically designed based on its demand and test cases.
Nice! Needs a couple of changes though — the math isn't quite right for summing the digits, and the while loop doesn't terminate as
ptris never incremented:JS / TS Shorthand I only discovered more recently than I'm willing to admit
var s = "2345";
var result = 1*s;
Works most of the time, but there are a few edge cases:
""," "are invalid inputs yet they return0There is a lot of invalid inputs ("aaa", "baa", etc). You must know what you do.
But "" and " " are VALID inputs, because it returns valid answer - 0.
Hey Vladas, sorry I wasn't clear enough in my response.
Let me illustrate my point:
Cheers!
It must be an internal parser which just skips initial blanks, and it's initialized to 0.
I would program exactly the same.