Microsoft Interview Question
SDE-3sCountry: United States
Interview Type: In-Person
I suppose that when you need integer value of the string, this mean that string has upper bound ( 2^32 -1) , because it represent integer or i didn't get anything?
as far as I get it, the meaning of "integer" here is not from standpoint of datatypes, but from standpoint of floating point (sorry for unintentional pun).
E.g. a number 1.000.000.000.000.000.000.000.000 in terms of task is also an integer, though rather a big one.
int convertString(String num) {
int res = 0;
boolean isNeg = false;
if (num.charAt(0) == '-')
isNeg = true;
else
res= res * 10 +(num.charAt(0) - '0');
for (int i = 1; i < num.length(); i++) {
res= res * 10 +(num.charAt(i) - '0');
}
return isNeg ? - res : res;
}
In C/C++, strings are char arrays terminated by '\0'
int _tmain(int argc, _TCHAR* argv[])
{
char s[] = "1000352";
int sum = 0;
for (char *p = s; *p != '\0'; p++)
{
int i = *p - '0';
sum = sum * 10 + i;
}
return 0;
}
unsigned __int64 convert(unsigned char* InputString)
{
// We assume that we always have a string for a positive value - no sign
int iLength;
unsigned char* pInputBegin;
unsigned char* pInputCurrent;
unsigned char* pInputEnd;
unsigned __int64 uiResult;
unsigned __int64 uiMultiplier;
// First, we find the end of the string (assuming there is no number bigger than 10**100 in the Universe):
pInputCurrent = InputString;
pInputBegin = InputString;
iLength = 0;
while (*pInputCurrent != NULL)
{
if (iLength >= 100)
{
return 0; // the number is too big
}
++pInputCurrent;
++iLength;
}
pInputEnd = pInputCurrent; // now we point to the last string character
uiResult = 0;
uiMultiplier = 1;
while (pInputCurrent >= pInputBegin)
{
uiResult = uiResult + uiMultiplier * (*pInputCurrent - 48); // ASCII characters 48...57 correspond to digits 0...9
uiMultiplier = uiMultiplier * 10;
--pInputCurrent;
}
return uiResult;
}
public class StringToNum {
public static void main(String[] args)
{
String numString = "1000322";
long num = convert(numString);
System.out.println(num);
}
private static long convert(String numString) {
long num = 0;
int i=1, pos = numString.length(), helper=0;
while(pos > 0)
{
pos -= 1;
helper = Integer.parseInt(numString.substring(pos, pos+1));
if(helper != 0)
{
num += helper * (Math.pow(10, i-1));
}
i++;
}
return num;
}
}public class StringToNum {
public static void main(String[] args)
{
String numString = "1000322";
long num = convert(numString);
System.out.println(num);
}
private static long convert(String numString) {
long num = 0;
int i=1, pos = numString.length(), helper=0;
while(pos > 0)
{
pos -= 1;
helper = Integer.parseInt(numString.substring(pos, pos+1));
if(helper != 0)
{
num += helper * (Math.pow(10, i-1));
}
i++;
}
return num;
}
}
#include <cstdio>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> convert(string inp) {
// Assumption: no leading 0's in input
int blockSize = static_cast<int>(log(pow(2,sizeof(int)*8 - 1))/log(10));
int length = inp.length();
int sign = (inp[0]=='-')?1:0;
int size = (length-sign)/blockSize + 1;
vector<int> result(size);
for(int i=sign;i<length;i++) {
int cur = (blockSize - length%blockSize + i-sign)/blockSize;
result[cur] = result[cur]*10 + (inp[i]-'0');
}
if(sign) result[0] *= -1;
return result;
}
int main()
{
string inp= "-3234567890";
vector<int> result = convert(inp);
for(vector<int>::iterator it = result.begin();it!=result.end();it++) {
cout << *it;
}
cout << endl;
return 0;
}
#include <cstdio>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> convert(string inp) {
// Assumption: no leading 0's in input
int blockSize = static_cast<int>(log(pow(2,sizeof(int)*8 - 1))/log(10));
int length = inp.length();
int sign = (inp[0]=='-')?1:0;
int size = (length-sign)/blockSize + 1;
vector<int> result(size);
for(int i=sign;i<length;i++) {
int cur = (blockSize - length%blockSize + i-sign)/blockSize;
result[cur] = result[cur]*10 + (inp[i]-'0');
}
if(sign) result[0] *= -1;
return result;
}
int main()
{
string inp= "-3234567890";
vector<int> result = convert(inp);
for(vector<int>::iterator it = result.begin();it!=result.end();it++) {
cout << *it;
}
cout << endl;
return 0;
}
#include <cstdio>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> convert(string inp) {
// Assumption: no leading 0's in input
int blockSize = static_cast<int>(log(pow(2,sizeof(int)*8 - 1))/log(10));
int length = inp.length();
int sign = (inp[0]=='-')?1:0;
int size = (length-sign)/blockSize + 1;
vector<int> result(size);
for(int i=sign;i<length;i++) {
int cur = (blockSize - length%blockSize + i-sign)/blockSize;
result[cur] = result[cur]*10 + (inp[i]-'0');
}
if(sign) result[0] *= -1;
return result;
}
int main()
{
string inp= "-3234567890";
vector<int> result = convert(inp);
for(vector<int>::iterator it = result.begin();it!=result.end();it++) {
cout << *it;
}
cout << endl;
return 0;
}
C# implemetation
public static void Run()
{
string input = "107080023";
int result = 0;
for(int i = 0; i < input.Length; i++)
{
// handled for "-" case
if (i == input.Length - 1 && (int)(input[0]) == 45)
{
result = result * -1;
}
// ascii '0':48 , '1':49 ...
else
{
result += (input[input.Length - 1 - i] - 48) * Convert.ToInt32(System.Math.Pow(10, i));
}
}
Console.WriteLine(result);
}
static void ConvertStringToInt(string myString)
{
int returnInt = 0;
int base1 = 1;
for (int i = myString.Length-1; i >=0; i--)
{
returnInt = returnInt + ((myString[i]-48) * base1);
base1 = base1 * 10;
}
Console.WriteLine(returnInt);
} static void ConvertStringToInt(string myString)
{
int returnInt = 0;
int base1 = 1;
for (int i = myString.Length-1; i >=0; i--)
{
returnInt = returnInt + ((myString[i]-48) * base1);
base1 = base1 * 10;
}
Console.WriteLine(returnInt);
}
c#, overflow is not handled.
- zr.roman January 18, 2016