Amazon Interview Question
Software DevelopersCountry: United States
Interview Type: Phone Interview
Code looks good but it does not handle, Integer max and min value cases,
Suppose in C# int max value is 2147483647, suppose if i give "2147483648" it fails.
#include <stdio.h>
int main(int argc, char* argv)
{
int a=0;
char* str=(char*)malloc(sizeof(100));
printf("\nEnter the String for integer conversion\n");
gets(str);
printf("\nInput provided::%s\n", str);
printf("\nThe interger output after conversion is::%d\n", strToInt(str));
getch(a);
}
int strToInt(char* str)
{
int result =0,i;
char c='0';
char h='9';
while(*str)
{
printf("\n*str=%c\n", *str);
printf("\n*str=%d\n", *str);
if(*str<c || *str>h)
{
printf("Invalid input\n");
break;
}
i=*str - c;
result=result*10+i;
str++;
}
return result;
}
Parse the given string from the end, character by character.
Here's a small snippet:
int res = 0;
int factor = 1;
for(int i = givenString.length()-1; i>=0; i--)
{
res = res + givenString.charAt(i)*factor;
factor = factor*10;
}
We have our integer we need.
The time complexity would be O(n).
'n' being the number of characters in the string.
convert it into a char array
then
sign=1;
cumulative=0;
BASE=10;
for (int i=0; arr[i] != '\0'; i++) //loop from front until NUL terminator
{
// take care of any preceding signs
if (arr[i]=='+') continue;
if (arr[i]=='-' ) { sign = -1; continue; }
// shift over previous sum by a digit (i.e., multiple by base)
// and current digit to said sum
cumulative = (arr[i]-'0') + cumulative*BASE;
}
return sign*cumulative;
We can use ASCII values(int) of the characters of the string to Parse it to an Integer.Below is the code for my implementation :
#include<string.h>
#include<stdio.h>
#include<math.h>
int canStringBeParsed(char*);
int parseInt(char*);
main(){
char *str;
int stringLength;
int parsedInt;
printf("Enter String Length: ");
scanf("%d", &stringLength);
str = (char*)malloc(stringLength*sizeof(char));
printf("Enter the String: ");
fflush(stdin);
gets(str);
if(canStringBeParsed(str)){//Handling Program when given String can't be parsed to Integer
parsedInt = parseInt(str);
printf("The Parsed Integer is: %d", parsedInt);
}
else{
printf("The given String can't be parsed to Integer");
}
}
int canStringBeParsed(char *str){
int i;
int len = strlen(str);
for(i=0; i<len; i++){
if(str[i] < 48 || str[i] > 57){
return 0;
}
}
return 1;
}
int parseInt(char *str){
int i, len, parsedInt=0;
len = strlen(str);
char charInt;
for(i=0; i<len; i++){
charInt = str[len-1-i];
parsedInt = parsedInt + pow(10, i)*(charInt-48);//Subtract 48 to convert (48-57) to (0-9)
}
return parsedInt;
}
----SOME MODIFICATION IN MY CODE----
A function
canStringBeParsed(char*)
can be added to check whether the given string can be parse to integer or not.So below is the final code :
#include<string.h>
#include<stdio.h>
#include<math.h>
int canStringBeParsed(char*);
int parseInt(char*);
main(){
char *str;
int stringLength;
int parsedInt;
printf("Enter String Length: ");
scanf("%d", &stringLength);
str = (char*)malloc(stringLength*sizeof(char));
printf("Enter the String: ");
fflush(stdin);
gets(str);
if(canStringBeParsed(str)){//Handling Program when given String can't be parsed to Integer
parsedInt = parseInt(str);
printf("The Parsed Integer is: %d", parsedInt);
}
else{
printf("The given String can't be parsed to Integer");
}
}
int canStringBeParsed(char *str){
int i;
int len = strlen(str);
for(i=0; i<len; i++){
if(str[i] < 48 || str[i] > 57){
return 0;
}
}
return 1;
}
int parseInt(char *str){
int i, len, parsedInt=0;
len = strlen(str);
char charInt;
for(i=0; i<len; i++){
charInt = str[len-1-i];
parsedInt = parsedInt + pow(10, i)*(charInt-48);//Subtract 48 to convert (48-57) to (0-9)
}
return parsedInt;
}
public static void parseInt(String intValue){
char[] chArry = intValue.toCharArray();
int sum = 0;
for(int i=0;i<chArry.length;i++){
int multiplyer = 1;
for(int j=chArry.length-i-1;j>0;j--){
multiplyer = multiplyer * 10;
}
sum = sum + (intValFun(chArry[i])* multiplyer);
}
System.out.println(sum);
}
public static int intValFun(char c){
int val = 0;
switch(c){
case '1':
val = 1;
break;
case '2':
val = 2;
break;
case '3':
val = 3;
break;
case '4':
val = 4;
break;
case '5':
val = 5;
break;
case '6':
val = 6;
break;
case '7':
val = 7;
break;
case '8':
val = 8;
break;
case '9':
val = 9;
break;
default:
val = 0;
break;
}
return val;
}
import java.util.*;
class printNos
{
static Hashtable vals = new Hashtable();
public static int Conv(String n)
{
for(int i=0; i<10; i++)
{
vals.put(i+"",i);
}
char[] num = n.toCharArray();
int val = 0;
int exp = num.length -1;
for(int i=0;i<num.length;i++)
{
val += (int)vals.get(num[i]+"") * (int)Math.pow(10, exp);
exp--;
}
return val;
}
public static void main(String args[])
{
System.out.println(Conv("1204"));
}
}
{public static int convertStringToInt(String str){
int length = str.length();
int exp = 0;
int value = 0;
for(int i= length-1; i>= 0; i--){
System.out.println(Math.pow(10,exp));
System.out.println(str.charAt(i));
System.out.println(new Integer(str.charAt(i) -48 ));
value += (Math.pow(10,exp)) * (new Integer(str.charAt(i)) -48 );
System.out.println(value);
exp++;
}
return value;
}}
{public static int convertStringToInt(String str){
int length = str.length();
int exp = 0;
int value = 0;
for(int i= length-1; i>= 0; i--){
System.out.println(Math.pow(10,exp));
System.out.println(str.charAt(i));
System.out.println(new Integer(str.charAt(i) -48 ));
value += (Math.pow(10,exp)) * (new Integer(str.charAt(i)) -48 );
System.out.println(value);
exp++;
}
return value;
}}
package prac;
import java.util.Scanner;
public class StringToInt {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
char[] charArr = input.toCharArray();
char[] reversedArr = reverse(charArr);
int multiplier = 1;
int num=0;
if(reversedArr==null){
System.out.println("string is invalid, can not be converted to int");
return;
}
for(int i=0;i<reversedArr.length;i++){
num = Character.getNumericValue(reversedArr[i])*multiplier + num;
multiplier = multiplier*10;
}
System.out.println(num);
}
private static char[] reverse(char[] charArr){
int len = charArr.length;
char[]reversedArr = new char[charArr.length];
int j=0;
for(int i=len-1;i>=0;i--){
int numericVal = (int)charArr[i];
if(charArr[i]==' '|| !(numericVal>=48 && numericVal<=57)){
return null;
}
reversedArr[j]=charArr[i];
j++;
}
return reversedArr;
}
}
#include <stdio.h>
int main(int argc, char* argv)
{
int a=0;
char* str=(char*)malloc(sizeof(100));
printf("\nEnter the String for integer conversion\n");
gets(str);
printf("\nInput provided::%s\n", str);
printf("\nThe interger output after conversion is::%d\n", strToInt(str));
getch(a);
}
int strToInt(char* str)
{
int result =0,i;
char c='0';
char h='9';
while(*str)
{
printf("\n*str=%c\n", *str);
printf("\n*str=%d\n", *str);
if(*str<c || *str>h)
{
printf("Invalid input\n");
break;
}
i=*str - c;
result=result*10+i;
str++;
}
return result;
}
import java.util.Scanner;
public class ParseInteger {
public int parse(String input) {
int out = 0;
int p = 1;
boolean isNeg = input.charAt(0) == '-';
for (int index = input.length() - 1; index > 0; index--) {
int c = input.charAt(index) - '0';
if (c > 9 || c < 0) {
System.out.println(" java.lang.NumberFormatException: For input string: " + input + "");
break;
}
out += c * p;
p *= 10;
}
if (isNeg) {
out *= -1;
} else {
int val = input.charAt(0) - '0';
out += val * p;
}
return out;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String input = s.nextLine();
s.close();
ParseInteger pi = new ParseInteger();
int output = pi.parse(input);
System.out.println(output);
}
}
package test;
public class AmazonParseInt {
public static void main(String[] args) {
String strInput = new String (""+2356789);
process (strInput);
}
public static void process (String str){
int resultado = 0, maxDigits;
int aux = 1;
int auxMultiply = aux;
for (int index=0; index<str.length(); index++){
aux = aux * 10;
}
resultado = aux;
maxDigits= aux;
for (int index=0; index<str.length(); index++){
aux = aux / 10;
auxMultiply = (Integer.valueOf(str.substring(index, index+1)) ) *aux;
resultado = resultado + auxMultiply ;
}
resultado = resultado -maxDigits ;
System.out.println(resultado);
}
}
- Nelson Perez July 01, 2015