The interviewer is looking for you to write an implementation of parseNumber
.
You'd walk the digits and add each digit + currentValue * 10
'.' then add add each digit times a multiplier digit * mult + currentValue; mult *= .1
function parseNumber(s) {
var value = 0;
var sign = 1;
var beforeDecimal = true;
var mult = .1;
var ndx = 0;
var len = s.length;
if (s[0] === '-') {
sign = -1;
ndx = 1;
}
while (ndx < len) {
var c = s[ndx];
if (c === '.') {
if (beforeDecimal) {
beforeDecimal = false;
} else {
// it's a second '.'. What to do? Error? Exit?
break;
}
} else if (c >= '0' || c <= '9') {
if (beforeDecimal) {
value = value * 10 + c.charCodeAt(0) - 48; // 48 = '0'
} else {
value = value + c * mult;
mult *= .1;
}
} else {
// what to do? Error, Exit?
break;
}
++ndx;
}
return sign * value;
}
console.log(parseNumber("123"));
console.log(parseNumber("-123"));
console.log(parseNumber("123.456"));
console.log(parseNumber("-123.456"));
console.log(parseNumber("-.42"));
console.log(parseNumber(".42"));
This doesn't handle things like 1E9
and it doesn't handle a preceding +
.
You might discuss separating the before and after decimal parts
function parseNumber(s) {
var value = 0;
var sign = 1;
var mult = .1;
var ndx = 0;
var len = s.length;
if (s[0] === '-') {
sign = -1;
ndx = 1;
}
// before decimal
while (ndx < len) {
var c = s[ndx++];
if (c === '.') {
break;
} else if (c >= '0' || c <= '9') {
value = value * 10 + c.charCodeAt(0) - 48; // 48 = '0'
} else {
// what to do? Error, Exit?
break;
}
}
// after decimal
if (c === '.') { // make sure we broke loop above for '.'
while (ndx < len) {
var c = s[ndx++];
if (c >= '0' || c <= '9') {
value = value + c * mult;
mult *= .1;
} else {
// what to do? Error, Exit?
break;
}
}
}
return sign * value;
}
console.log(parseNumber("123"));
console.log(parseNumber("-123"));
console.log(parseNumber("123.456"));
console.log(parseNumber("-123.456"));
console.log(parseNumber("-.42"));
console.log(parseNumber(".42"));
You might also consider what to do about errors (return NaN
?), and if you were to implement parseInt
handling the radix
argument.