Amazon Interview Question
SDE-2sTeam: AWS
Country: United States
Attempt at a solution. Note that there is no error checking done in this code but in an interview it would be worth pointing out where errors may occur.
// ======================================================================
// Filename: deck.cc
// Description: Deck and card classes meeting requirements.
// Created: Thu Sep 1 20:51:26 2016 (-0500)
// Last-Updated: Thu Sep 1 21:29:36 2016 (-0500)
// Author: Ivan Guerra
// ======================================================================
#include <algorithm>
#include <string>
#include <vector>
class Card {
private:
typedef std::size_t size_type;
std::string m_suit;
size_type m_value;
public:
Card(const std::string& suit, size_type value) : m_suit(suit), m_value(value) { }
std::string get_suit() const { return m_suit; }
size_type get_value() const { return m_value; }
void set_suit(const std::string& suit) { m_suit = suit; }
void set_value(size_type value) { m_value = value; }
friend bool operator==(const Card& lhs, const Card& rhs) { return (lhs.m_suit == rhs.m_suit) && (lhs.m_value == rhs.m_value); }
};
class Deck {
private:
typedef std::size_t size_type;
typedef std::vector<Card> card_set;
card_set m_cards;
public:
Deck() { }
Deck(const card_set& cards) : m_cards(cards) { }
size_type n_cards() const { return m_cards.size(); }
void shuffle() { std::random_shuffle(m_cards.begin(), m_cards.end()); }
Card draw_top() const { return m_cards[0]; }
Card draw_bottom() const { return m_cards.back(); }
Card draw_random();
void add_card(const Card& val) { m_cards.push_back(val); }
void remove_card(const Card& val) { m_cards.erase(std::find(m_cards.begin(), m_cards.end(), val)); }
std::vector<Deck> deal(size_type n_persons, size_type hand_size);
};
Card Deck::draw_random() {
shuffle();
return draw_top();
}
std::vector<Deck> Deck::deal(size_type n_persons, size_type hand_size) {
std::vector<Deck> user_decks(n_persons);
for (auto i = 0; i < n_persons; i++) {
for (auto j = 0; j < hand_size; j++) {
Card selected_card = draw_random();
user_decks[i].add_card(selected_card);
remove_card(selected_card);
}
}
return user_decks;
}
CardShape.java
and
package com.ankitgupta;
/**
* Created by ankitgupta on 9/9/16.
*/
public enum CardShape {
SPADE,
DIAMOND,
CLUB,
HEART;
}
and
CardNumber.java
and
package com.ankitgupta;
/**
* Created by ankitgupta on 9/9/16.
*/
public enum CardNumber {
ACE,
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE,
TEN,
JACK,
QUEEN,
KING;
}
and
Card.java
and
package com.ankitgupta;
/**
* Created by ankitgupta on 9/9/16.
*/
public class Card {
CardShape shape;
CardNumber number;
Card(CardShape shape,CardNumber number){
this.shape = shape;
this.number = number;
}
public CardNumber getNumber() {
return number;
}
public CardShape getShape() {
return shape;
}
public String getName(){
return number + " of " + shape;
}
}
and
Deck.java
and
package com.ankitgupta;
import java.util.Random;
import java.util.Stack;
/**
* Created by ankitgupta on 9/9/16.
*/
public class Deck {
public static Stack<Card> getNewSortedDeck(){
Stack<Card> cardDeck = new Stack<Card>();
for (CardShape shape: CardShape.values()){
for (CardNumber number: CardNumber.values()){
Card card = new Card(shape,number);
cardDeck.push(card);
}
}
return cardDeck;
}
public static Stack<Card> getShuffeledDeck(){
return getShuffeledDeck(getNewSortedDeck());
}
public static Stack<Card> getShuffeledDeck(Stack<Card> deck){
Stack<Card> cardDeck = new Stack<Card>();
int count = 0;
for (int i=deck.size();i>0;i--){
Random random = new Random();
Card randomCard = deck.remove(random.nextInt(i));
cardDeck.push(randomCard);
}
return cardDeck;
}
public static void printDeck(Stack<Card> deck){
for (int i=0 ; i<deck.size();i++) {
System.out.println("Adding Random Card No. " + (i+1) + " to the Deck : " + deck.get(i).getName());
}
}
}
and
Player.java
and
package com.ankitgupta;
import java.util.Stack;
/**
* Created by ankitgupta on 9/9/16.
*/
public class Player {
private String name;
private Stack<Card> cards;
Player (String name){
this.name = name;
this.cards = new Stack<Card>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Stack<Card> getCards() {
return cards;
}
public void setCards(Stack<Card> cards) {
this.cards = cards;
}
public void addCard(Card card){
this.cards.push(card);
}
public void removeCard(Card card){
this.cards.remove(card);
}
}
and
CardGame.java
and
package com.ankitgupta;
import java.security.PublicKey;
import java.util.Stack;
/**
* Created by ankitgupta on 9/9/16.
*/
public class CardGame {
private Player[] players;
private int cardsPerPlayer;
Stack<Card> stackOfCards = Deck.getShuffeledDeck();
CardGame(Player[] players){
this.players = players;
this.cardsPerPlayer=0;
}
CardGame(Player[] players, int cardsPerPlayer){
this.players = players;
this.cardsPerPlayer = cardsPerPlayer;
}
public void dealCards(){
int playerCount = players.length;
if (playerCount>0){
int cardsToDeal = cardsPerPlayer==0? stackOfCards.size() :cardsPerPlayer*playerCount;
for (int i=0;i<cardsToDeal;i++){
players[i%playerCount].addCard(stackOfCards.pop());
}
}
}
public Stack<Card> getStackOfCards(){
return stackOfCards;
}
}
and
Deal.java
and
package com.ankitgupta;
import java.util.Stack;
/**
* Created by ankitgupta on 9/9/16.
*/
public class Deal {
public static void main(String[] args) {
Player player1 = new Player("Player1");
Player player2 = new Player("Player2");
Player player3 = new Player("Player3");
Player player4 = new Player("Player4");
Player[] players = {player1,player2,player3,player4};
CardGame game = new CardGame(players);
game.dealCards();
System.out.println("Player 1 Cards : ");
Deck.printDeck(player1.getCards());
System.out.println("Player 2 Cards : ");
Deck.printDeck(player2.getCards());
System.out.println("Player 3 Cards : ");
Deck.printDeck(player3.getCards());
System.out.println("Player 4 Cards : ");
Deck.printDeck(player4.getCards());
System.out.println("Remaining Cards : ");
Deck.printDeck(game.getStackOfCards());
}
}
and
CardShape.java
package com.ankitgupta;
/**
* Created by ankitgupta on 9/9/16.
*/
public enum CardShape {
SPADE,
DIAMOND,
CLUB,
HEART;
}
CardNumber.java
package com.ankitgupta;
/**
* Created by ankitgupta on 9/9/16.
*/
public enum CardNumber {
ACE,
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE,
TEN,
JACK,
QUEEN,
KING;
}
Card.java
package com.ankitgupta;
/**
* Created by ankitgupta on 9/9/16.
*/
public class Card {
CardShape shape;
CardNumber number;
Card(CardShape shape,CardNumber number){
this.shape = shape;
this.number = number;
}
public CardNumber getNumber() {
return number;
}
public CardShape getShape() {
return shape;
}
public String getName(){
return number + " of " + shape;
}
}
Deck.java
package com.ankitgupta;
import java.util.Random;
import java.util.Stack;
/**
* Created by ankitgupta on 9/9/16.
*/
public class Deck {
public static Stack<Card> getNewSortedDeck(){
Stack<Card> cardDeck = new Stack<Card>();
for (CardShape shape: CardShape.values()){
for (CardNumber number: CardNumber.values()){
Card card = new Card(shape,number);
cardDeck.push(card);
}
}
return cardDeck;
}
public static Stack<Card> getShuffeledDeck(){
return getShuffeledDeck(getNewSortedDeck());
}
public static Stack<Card> getShuffeledDeck(Stack<Card> deck){
Stack<Card> cardDeck = new Stack<Card>();
int count = 0;
for (int i=deck.size();i>0;i--){
Random random = new Random();
Card randomCard = deck.remove(random.nextInt(i));
cardDeck.push(randomCard);
}
return cardDeck;
}
public static void printDeck(Stack<Card> deck){
for (int i=0 ; i<deck.size();i++) {
System.out.println("Adding Random Card No. " + (i+1) + " to the Deck : " + deck.get(i).getName());
}
}
}
Player.java
package com.ankitgupta;
import java.util.Stack;
/**
* Created by ankitgupta on 9/9/16.
*/
public class Player {
private String name;
private Stack<Card> cards;
Player (String name){
this.name = name;
this.cards = new Stack<Card>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Stack<Card> getCards() {
return cards;
}
public void setCards(Stack<Card> cards) {
this.cards = cards;
}
public void addCard(Card card){
this.cards.push(card);
}
public void removeCard(Card card){
this.cards.remove(card);
}
}
CardGame.java
package com.ankitgupta;
import java.security.PublicKey;
import java.util.Stack;
/**
* Created by ankitgupta on 9/9/16.
*/
public class CardGame {
private Player[] players;
private int cardsPerPlayer;
Stack<Card> stackOfCards = Deck.getShuffeledDeck();
CardGame(Player[] players){
this.players = players;
this.cardsPerPlayer=0;
}
CardGame(Player[] players, int cardsPerPlayer){
this.players = players;
this.cardsPerPlayer = cardsPerPlayer;
}
public void dealCards(){
int playerCount = players.length;
if (playerCount>0){
int cardsToDeal = cardsPerPlayer==0? stackOfCards.size() :cardsPerPlayer*playerCount;
for (int i=0;i<cardsToDeal;i++){
players[i%playerCount].addCard(stackOfCards.pop());
}
}
}
public Stack<Card> getStackOfCards(){
return stackOfCards;
}
}
Deal.java
package com.ankitgupta;
import java.util.Stack;
/**
* Created by ankitgupta on 9/9/16.
*/
public class Deal {
public static void main(String[] args) {
Player player1 = new Player("Player1");
Player player2 = new Player("Player2");
Player player3 = new Player("Player3");
Player player4 = new Player("Player4");
Player[] players = {player1,player2,player3,player4};
CardGame game = new CardGame(players);
game.dealCards();
System.out.println("Player 1 Cards : ");
Deck.printDeck(player1.getCards());
System.out.println("Player 2 Cards : ");
Deck.printDeck(player2.getCards());
System.out.println("Player 3 Cards : ");
Deck.printDeck(player3.getCards());
System.out.println("Player 4 Cards : ");
Deck.printDeck(player4.getCards());
System.out.println("Remaining Cards : ");
Deck.printDeck(game.getStackOfCards());
}
}
- Dhatchana Moorthy August 21, 2016