Amazon Interview Question
SDE1sCountry: United States
Interview Type: Written Test
public static double calculatePayout(Member member)
{
double payout = member.getMonthlySales() * .1;
double recruitSales = 0;
Collection<Member> allRecruits = new Collection<Member>();
while( !allRecruits.isEmpty() )
{
Member recruit = allRecruits.First();
recruitSales += recruit.getMonthlySales();
allRecruits.remove(recruit);
allRecruits.AddRange(recruit.getRecruitedMembers());
}
return payout + (recruitSales * .04);
}
@echen57 what about the monthly sales of the recruited members of the current recruit? It needs a recursive logic.
Define a variable to keep track of what recruit level you are at. 0 for the member you are calculating the commission for.
public static int level = 0;
public static double calculatePayout(Member member) {
ArrayList<Member> members = (ArrayList<Member>) member.getRecruitedMembers();
level = level + 1;
if(members!=null){
for(int i=0; i< members.size();){
calculatePayout(members.get(i++));
}
}
level = level - 1;
if(level==0){
return payout + (member.getMonthlySales() * 0.1);
}else{
return payout + (member.getMonthlySales() * 0.04);
}
}
public static double calculatePayout(Member member) {
ArrayList<Member> members = (ArrayList<Member>) member.getRecruitedMembers();
level = level + 1;
if(members!=null){
for(int i=0; i< members.size();){
calculatePayout(members.get(i++));
}
}
level = level - 1;
if(level==0){
return payout + (member.getMonthlySales() * 0.1);
}else{
return payout + (member.getMonthlySales() * 0.04);
}
}
btw, payout is also static double variable I defined in the class
public static double payout = 0;
how about this recursive logic?
public static double calculatePayoutRecruits(Member member, double total) {
total = total + member.getMonthlySales();
Collection<Member> myRecruits = member.getRecruitedMembers();
if(!myRecruits.isEmpty())
{
for(Member m : myRecruits)
{
total = total + MemberPayoutUtil.calculatePayoutRecruits(m,total);
}
}
}
public static double calculatePayout(Member member) {
double sum = MemberPayoutUtil.calculatePayoutRecruits(member,0);
}
One more recursive:
public class MemberPayoutUtil {
public static double calculatePayout(Member member) {
double salesRecruits = 0;
if (member.getRecruitedMembers() == null) {
return member.getMonthlySales() * 0.1;
}
for (Member otherMember : member.getRecruitedMembers()) {
salesRecruits += getDirectSales(otherMember);
}
return (member.getMonthlySales() * 0.1) + (salesRecruits * 0.04);
}
private static double getDirectSales(Member member) {
double sales = member.getMonthlySales();
if (member.getRecruitedMembers() == null) {
return sales;
}
for (Member otherMember : member.getRecruitedMembers()) {
sales += getDirectSales(otherMember);
}
return sales;
}
Trying to use recursive logic to get the total sales of one member's recruits
public static double calculateSales(Member member){
double sales=member.getMonthlySales();
Collection<Member> recruitedMembers=member.getRecruitedMembers();
for(Member mem:recruitedMembers){
sales+=calculateSales(mem);
}
return(sales);
}
public static double calculatePayout(Member member){
double sales=member.getMonthlySales();
double other=0;
Collection<Member> recruitedMembers=member.getRecruitedMembers();
for(Member mem:recruitedMembers){
other+=calculateSales(mem);
}
return(sales*0.1+other*0.04);
}
public double calculatePayout(Member member)
{
double directPayout = member.getMonthlySales()*0.1;
List<Member> recruits = member.getRecruitedMembers();
Stack<Member> recruitStack = new Stack<Member>();
double payOut=0,total=0;
if(recruits.size()>0)
{
for(Member m : recruits)
{
recruitStack.push(m);
payOut = payOut + 0.04 * m.getMonthlySales();
while(!recruitStack.isEmpty())
{
Member m1 = recruitStack.pop();
payOut = payOut + 0.04 * m1.getMonthlySales();
if(!m1.getRecruitedMembers().isEmpty())
{
recruitStack.addAll(m1.getRecruitedMembers());
}
}
}
}
return payOut+directPayout;
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
interface Member {
public double getMonthlySales();
Collection<Member> getRecruitedMembers();
}
public class MemberPayoutUtil {
public static double calculatePayout(Member member) {
// Implement me!
final class TotalSalesTask extends RecursiveTask<Double> {
private final Member m;
TotalSalesTask(Member m) {
this.m = m;
}
@Override
public Double compute() {
List<TotalSalesTask> subTasks = new ArrayList<>();
for (Member sub : m.getRecruitedMembers()) {
TotalSalesTask subTask = new TotalSalesTask(sub);
subTask.fork();
subTasks.add(subTask);
}
double sum = m.getMonthlySales();
for (TotalSalesTask subTask : subTasks) {
try {
sum += subTask.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
return sum;
}
}
ForkJoinPool forkJoinPool = new ForkJoinPool();
Double allSales = forkJoinPool.invoke(new TotalSalesTask(member));
return allSales * 0.04 + member.getMonthlySales() * 0.06;
}
public static void main(String[] args) {
class MockMember implements Member {
private final double sales;
private final Collection<Member> members;
MockMember(double sales, Collection<Member> members) {
this.sales = sales;
this.members = members;
}
MockMember(double sales, int subs, double subSales) {
this.sales = sales;
members = new ArrayList<>(subs);
for (int i = 0; i < subs; i++) {
Member sub = new MockMember(subSales, null);
members.add(sub);
}
}
@Override
public Collection<Member> getRecruitedMembers() {
if (members == null) {
return Collections.emptyList();
}
return members;
}
@Override
public double getMonthlySales() {
return sales;
}
}
List<Member> members = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Member m = new MockMember(100, 10, 100);
members.add(m);
}
Member member = new MockMember(100, members);
// member with 110 subs, each member sales equals 100.
// thus 100*110*0.04 + 100*0.1 = 450
System.out.println(MemberPayoutUtil.calculatePayout(member));
}
}
This should work:
- thelineofcode December 15, 2013