Uber Interview Question
Software EngineersCountry: United States
Interview Type: In-Person
'''
479
xyz
x - hundred
y - ninety, eighty, seventy, ..., twenty,
z -
nineteen, eighteen, seventeen, ..., twelve, eleven, ten
nine, eight, seven, six, ..., two, one
'''
DIGIT_MAP = {
1: 'one',
2: 'two',
3: 'three',
4: 'four',
5: 'five',
6: 'six',
7: 'seven',
8: 'eight',
9: 'nine'
}
DOUBLES_MAP = {
2: 'twenty',
3: 'thirty',
4: 'fourty',
5: 'fifty',
6: 'sixty',
7: 'seventy',
8: 'eighty',
9: 'ninety'
}
TEENS_MAP = {
10: 'ten',
11: 'eleven',
12: 'twelve',
13: 'thirteen',
14: 'fourteen',
15: 'fifteen',
16: 'sixteen',
17: 'seventeen',
18: 'eighteen',
19: 'nineteen'
}
def hundreds_group_to_words(num, groups, suffix=None):
if num == 0:
return
x = (num // 100) % 10
y = (num // 10) % 10
z = (num // 1) % 10
group = []
if x > 0:
group.append(DIGIT_MAP[x])
group.append('hundred')
if y > 0:
if y > 1:
group.append(DOUBLES_MAP[y])
if z > 1:
group.append(DIGIT_MAP[z])
else:
group.append(TEENS_MAP[y * 10 + z])
elif z > 0:
group.append(DIGIT_MAP[z])
if suffix is not None:
group.append(suffix)
groups.append(group)
def digits_to_words(s):
# 0 <= num < 1000000000000 (1 trillion)
n = len(s)
assert n > 0, f"s must be non-empty: {s}"
if s[0] == '-':
n -= 1
negative = True
else:
negative = False
assert n < 13, f"s must be less than 1000000000000: {s}"
num = -int(s) if negative else int(s)
groups = []
# Pre-thousands
pre_k = num % 1000
hundreds_group_to_words(pre_k, groups)
# Pre-millions
num //= 1000
pre_m = num % 1000
hundreds_group_to_words(pre_m, groups, 'thousand')
# Pre-billions
num //= 1000
pre_g = num % 1000
hundreds_group_to_words(pre_g, groups, 'million')
# Pre-trillions
num //= 1000
pre_t = num % 1000
hundreds_group_to_words(pre_t, groups, 'billion')
if negative:
groups.append(['negative'])
# for group in groups[::-1]:
# print(group)
# tmp = ' '.join(group)
# print(tmp.__repr__())
return ' '.join(' '.join(group) for group in groups[::-1])
print(digits_to_words('-100904'))
print(digits_to_words('1234567890'))
'''
479
xyz
x - hundred
y - ninety, eighty, seventy, ..., twenty,
z -
nineteen, eighteen, seventeen, ..., twelve, eleven, ten
nine, eight, seven, six, ..., two, one
'''
DIGIT_MAP = {
1: 'one',
2: 'two',
3: 'three',
4: 'four',
5: 'five',
6: 'six',
7: 'seven',
8: 'eight',
9: 'nine'
}
DOUBLES_MAP = {
2: 'twenty',
3: 'thirty',
4: 'fourty',
5: 'fifty',
6: 'sixty',
7: 'seventy',
8: 'eighty',
9: 'ninety'
}
TEENS_MAP = {
10: 'ten',
11: 'eleven',
12: 'twelve',
13: 'thirteen',
14: 'fourteen',
15: 'fifteen',
16: 'sixteen',
17: 'seventeen',
18: 'eighteen',
19: 'nineteen'
}
def hundreds_group_to_words(num, groups, suffix=None):
if num == 0:
return
x = (num // 100) % 10
y = (num // 10) % 10
z = (num // 1) % 10
group = []
if x > 0:
group.append(DIGIT_MAP[x])
group.append('hundred')
if y > 0:
if y > 1:
group.append(DOUBLES_MAP[y])
if z > 1:
group.append(DIGIT_MAP[z])
else:
group.append(TEENS_MAP[y * 10 + z])
elif z > 0:
group.append(DIGIT_MAP[z])
if suffix is not None:
group.append(suffix)
groups.append(group)
def digits_to_words(s):
# 0 <= num < 1000000000000 (1 trillion)
n = len(s)
assert n > 0, f"s must be non-empty: {s}"
if s[0] == '-':
n -= 1
negative = True
else:
negative = False
assert n < 13, f"s must be less than 1000000000000: {s}"
num = -int(s) if negative else int(s)
groups = []
# Pre-thousands
pre_k = num % 1000
hundreds_group_to_words(pre_k, groups)
# Pre-millions
num //= 1000
pre_m = num % 1000
hundreds_group_to_words(pre_m, groups, 'thousand')
# Pre-billions
num //= 1000
pre_g = num % 1000
hundreds_group_to_words(pre_g, groups, 'million')
# Pre-trillions
num //= 1000
pre_t = num % 1000
hundreds_group_to_words(pre_t, groups, 'billion')
if negative:
groups.append(['negative'])
# for group in groups[::-1]:
# print(group)
# tmp = ' '.join(group)
# print(tmp.__repr__())
return ' '.join(' '.join(group) for group in groups[::-1])
print(digits_to_words('-100904'))
print(digits_to_words('1234567890'))
Stack<String> w = new Stack<String>();
//int n = 55; // 110111
//int n = 53; // 110101
int n = 54; // 110110
//int n = 52; // 110100
int thousands = (n&((~(0xFFFFFFFF<<3))<<3))>>3;
int hundreds = n&(~(0xFFFFFFFF<<3));
if((hundreds&(1<<1)) > 0){
if((hundreds&1) > 0)
w.push("eleven");
else
w.push("ten");
}else {
if((hundreds&1) > 0)
w.push("one");
}
if((hundreds&(1<<2)) > 0) {
w.push("one hundred");
}
if(thousands >0) {
w.push("and");
if((thousands&(1<<1)) > 0){
if((thousands&1) > 0)
w.push("eleven thousand");
else
w.push("ten thousand");
}else {
if((thousands&1) > 0)
w.push("one thousand");
}
if((thousands&(1<<2)) > 0) {
w.push("one hundred");
}
}
while(!w.empty())
System.out.print(w.pop() + " ");
public class HelloWorld{
static String[] ones = {"one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen", "ninenteen", "twenty",
};
static String[] tens = {"thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
};
static String[] above = { "hundred", "thousand", "million",
"billion", "trillion"};
public static void main(String []args){
System.out.println(getNumber(109933213));
}
static String getNumber (Integer num){
if(num == 0) return "";
if(num < 21) return ones[num-1];
if(num < 100){
if(num%10 == 0) return tens[num/10-3];
else return tens[num/10-3] + " " + ones[num%10-1];
}
if(num < 1000){
if(num%100 == 0) return getNumber(num/100) + " " + above[0];
else return getNumber(num/100) + " " + above[0] + " " + getNumber(num%100);
}
if(num < 1000000){
if(num%1000 == 0) return getNumber(num/1000) + " " + above[1];
else return getNumber(num/1000) + " " + above[1] + " " + getNumber(num%1000);
}
if(num < 1000000000){
if(num%1000000 == 0) return getNumber(num/1000000) + " " + above[2];
else return getNumber(num/1000000) + " " + above[2] + " " + getNumber(num%1000000);
}
return "";
}
}
public class HelloWorld{
static String[] ones = {"one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen", "ninenteen", "twenty",
};
static String[] tens = {"thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
};
static String[] above = { "hundred", "thousand", "million",
"billion", "trillion"};
public static void main(String []args){
System.out.println(getNumber(109933213));
}
static String getNumber (Integer num){
if(num == 0) return "";
if(num < 21) return ones[num-1];
if(num < 100){
if(num%10 == 0) return tens[num/10-3];
else return tens[num/10-3] + " " + ones[num%10-1];
}
if(num < 1000){
if(num%100 == 0) return getNumber(num/100) + " " + above[0];
else return getNumber(num/100) + " " + above[0] + " " + getNumber(num%100);
}
if(num < 1000000){
if(num%1000 == 0) return getNumber(num/1000) + " " + above[1];
else return getNumber(num/1000) + " " + above[1] + " " + getNumber(num%1000);
}
if(num < 1000000000){
if(num%1000000 == 0) return getNumber(num/1000000) + " " + above[2];
else return getNumber(num/1000000) + " " + above[2] + " " + getNumber(num%1000000);
}
return "";
}
}
public class HelloWorld{
static String[] ones = {"one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen", "ninenteen", "twenty",
};
static String[] tens = {"thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
};
static String[] above = { "hundred", "thousand", "million",
"billion", "trillion"};
public static void main(String []args){
System.out.println(getNumber(109933213));
}
static String getNumber (Integer num){
if(num == 0) return "";
if(num < 21) return ones[num-1];
if(num < 100){
if(num%10 == 0) return tens[num/10-3];
else return tens[num/10-3] + " " + ones[num%10-1];
}
if(num < 1000){
if(num%100 == 0) return getNumber(num/100) + " " + above[0];
else return getNumber(num/100) + " " + above[0] + " " + getNumber(num%100);
}
if(num < 1000000){
if(num%1000 == 0) return getNumber(num/1000) + " " + above[1];
else return getNumber(num/1000) + " " + above[1] + " " + getNumber(num%1000);
}
if(num < 1000000000){
if(num%1000000 == 0) return getNumber(num/1000000) + " " + above[2];
else return getNumber(num/1000000) + " " + above[2] + " " + getNumber(num%1000000);
}
return "";
}
}
Looking for coaching on interview preparation?
Visit AONECODE.COM for ONE-TO-ONE private lessons by FB, Google and Uber engineers!
System Design (for candidates of FB, LinkedIn, AMZ, Google and Uber etc)
Algorithms (DP, Greedy, Graph etc. advanced algorithms and clean coding)
Interview questions sorted by companies
Mock Interviews
Ace G, U, FB, Amazon, LinkedIn, MS and other top-tier interviews in weeks of training.
Feel free to email us aonecoding@gmail.com with any questions. Thanks!
SOLUTION:
- aonecoding February 15, 2018