Amazon Interview Question for SDE1s


Country: United States
Interview Type: Written Test




Comment hidden because of low score. Click to expand.
0
of 6 vote

This should work:

public static double calculatePayout(Member member) {

	double payout = member.getMonthlySales() * 0.1;
	double sumForRecruits = 0;
	Collection<Member> recruitedMembers = member.getRecruitedMembers();
	Collection<Member> newRecruits = new ArrayList<Member>();
	while (!recruitedMembers.isEmpty()) {
	    for (Member recruit : recruitedMembers) {
		sumForRecruits += recruit.getMonthlySales();
		newRecruits.addAll(recruit.getRecruitedMembers());
	    }
	    recruitedMembers.clear();
	    recruitedMembers.addAll(newRecruits);
	    newRecruits.clear();
	}
	return payout + sumForRecruits * 0.04;
    }

- thelineofcode December 15, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

Looks good. +1

- Diego Giagio December 15, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

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 December 15, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
1
of 1 vote

@echen57 what about the monthly sales of the recruited members of the current recruit? It needs a recursive logic.

- Diego Giagio December 15, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

This will fail at compilation. You cannot instantiate Collection. You will have to define it as anonymous class.

- AlgoAlgae December 16, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

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);
}
}

- Anonymous December 16, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

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);
		}

}

- Anonymous December 16, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

btw, payout is also static double variable I defined in the class
public static double payout = 0;

- AlgoAlgae December 16, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

small correction in if else condition at the end :

if(level==0){
			payout = payout + (member.getMonthlySales() * 0.1);
		}else{
			payout = payout + (member.getMonthlySales() * 0.04);
		}
		return payout;

- AlgoAlgae December 16, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

PS : that is my code above. dint realize I was logged off when posting.

- AlgoAlgae December 16, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

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);
    	
    }

- amey December 16, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

we can obviously modify to calculate 10% and subsequent 4%

- amey December 16, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

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;
    }

- krylloff December 16, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

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);
	}

- chengyuanzhang831 January 06, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

This won't work, as 10% is applicable only to top level member not his recruits.

- Abhi March 27, 2014 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

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;

}

- Abhinav Tiwary February 03, 2014 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

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));
	}

}

- ttoommbb@126.com August 24, 2014 | Flag Reply


Add a Comment
Name:

Writing Code? Surround your code with {{{ and }}} to preserve whitespace.

Books

is a comprehensive book on getting a job at a top tech company, while focuses on dev interviews and does this for PMs.

Learn More

Videos

CareerCup's interview videos give you a real-life look at technical interviews. In these unscripted videos, watch how other candidates handle tough questions and how the interviewer thinks about their performance.

Learn More

Resume Review

Most engineers make critical mistakes on their resumes -- we can fix your resume with our custom resume review service. And, we use fellow engineers as our resume reviewers, so you can be sure that we "get" what you're saying.

Learn More

Mock Interviews

Our Mock Interviews will be conducted "in character" just like a real interview, and can focus on whatever topics you want. All our interviewers have worked for Microsoft, Google or Amazon, you know you'll get a true-to-life experience.

Learn More