From 0bd476cae6f5e9dec7644627a821c7bb50294add Mon Sep 17 00:00:00 2001 From: Manuel Meraz Date: Tue, 10 Jan 2017 19:50:39 -0800 Subject: [PATCH 1/3] saving LinkedList --- challenge_8/cpp/manuel/Makefile | 28 ++++ challenge_8/cpp/manuel/README.md | 24 ++++ challenge_8/cpp/manuel/src/LinkedList.cpp | 136 ++++++++++++++++++ .../cpp/manuel/src/include/LinkedList.h | 36 +++++ challenge_8/cpp/manuel/src/include/tools.h | 11 ++ challenge_8/cpp/manuel/src/main.cpp | 14 ++ challenge_8/cpp/manuel/src/tools.cpp | 28 ++++ 7 files changed, 277 insertions(+) create mode 100644 challenge_8/cpp/manuel/Makefile create mode 100644 challenge_8/cpp/manuel/README.md create mode 100644 challenge_8/cpp/manuel/src/LinkedList.cpp create mode 100644 challenge_8/cpp/manuel/src/include/LinkedList.h create mode 100644 challenge_8/cpp/manuel/src/include/tools.h create mode 100644 challenge_8/cpp/manuel/src/main.cpp create mode 100644 challenge_8/cpp/manuel/src/tools.cpp diff --git a/challenge_8/cpp/manuel/Makefile b/challenge_8/cpp/manuel/Makefile new file mode 100644 index 000000000..aa263e535 --- /dev/null +++ b/challenge_8/cpp/manuel/Makefile @@ -0,0 +1,28 @@ +SRC := $(wildcard src/*.cpp) +HEADERS := $(wildcard $(addprefix src/include/, *.h)) + +OBJDIR := obj +BINDIR := bin +OBJECTS := $(addprefix $(OBJDIR)/, $(notdir src/ $(SRC:.cpp=.o))) + +EXE := solution.exe +CC := g++ +CFLAGS := -Wall -c -std=c++11 +LFLAGS := -Wall + +$(EXE) : $(BINDIR) $(OBJDIR) $(OBJECTS) + @$(CC) $(LFLAGS) -o $(BINDIR)/$@ $(OBJECTS) + +obj/%.o : src/%.cpp $(HEADERS) + @$(CC) $(CFLAGS) -o $@ $< + +.PHONY : clean $(BINDIR) $(OBJDIR) + +clean : + @rm -rf $(BINDIR) $(OBJDIR) + +$(BINDIR) : + @mkdir -p $(BINDIR) + +$(OBJDIR) : + @mkdir -p $(OBJDIR) diff --git a/challenge_8/cpp/manuel/README.md b/challenge_8/cpp/manuel/README.md new file mode 100644 index 000000000..5261ff4c2 --- /dev/null +++ b/challenge_8/cpp/manuel/README.md @@ -0,0 +1,24 @@ +# Challenge Name +###### C++11 @manuel + +### 1. Approch to Solving the problem + +Given a set of numbers ranging from 0 to N-1 with one missing number, +then the largest number in that set is the length of the array. + +If we find the sum of N + (N-1) + (N - 2) + ... + (N - N) = N * (N + 1) / 2, +and then iterate through the given set and subtract this value, once we +reach the end of the array the difference will be the missing number. + +### 2. How to compile and run this code + +``` +make +make test +make clean +``` + +### 3. How this program works + +Single line of input -> Single line of output + 1,3,4,0 -> 2 diff --git a/challenge_8/cpp/manuel/src/LinkedList.cpp b/challenge_8/cpp/manuel/src/LinkedList.cpp new file mode 100644 index 000000000..c58cd4496 --- /dev/null +++ b/challenge_8/cpp/manuel/src/LinkedList.cpp @@ -0,0 +1,136 @@ +#include +#include +#include /*srand, rand */ +#include +#include // std::remove +#include +#include // ptrdiff_t + +#include "include/LinkedList.h" + +LinkedList::LinkedList() { + head = NULL; + current_node = head; + prev_node = NULL; + members = new std::vector; + + // Array is linked list in reverse + members->push_back(head); +} + +LinkedList::LinkedList(std::vector *new_members) { + head = (*new_members)[members->size() - 1]; + current_node = head; + prev_node = NULL; + members = new_members; +} + +LinkedList::~LinkedList() { + for(Node *i:*members){ + delete i; + } + + delete[] members; +} + +std::string LinkedList::data() { + return current_node->data; +} + +void LinkedList::insert(std::string data) { + // Inserts node to front of list + // Resets random pointers to new nodes + + Node *new_node = new Node(); + new_node->data = data; + new_node->next = head; + members->push_back(new_node); + head = new_node; + + // Randomise all nodes again + while(new_node != NULL) { + set_random(new_node); + new_node = new_node->next; + } + + +} + +std::string LinkedList::pop() { + // Pops off current node from list + + // Remove from members list + members->erase(std::remove(members->begin(), members->end(), current_node), members->end()); + + // Connect previous and next node + std::string data = current_node->data; + prev_node->next = current_node->next; + + delete current_node; + return data; +} + +bool LinkedList::next() { + if(current_node->next != NULL) { + prev_node = current_node; + current_node = current_node->next; + return true; + } + + return false; +} + +void LinkedList::random() { + // Jump to random node! + + srand(time(NULL)); + int index = members->size() - 1; + index = rand() % index; + + if(index == 0) { + prev_node = NULL; + } else { + prev_node = (*members)[index - 1]; + } + + current_node = (*members)[index]; +} + + +void LinkedList::set_random(Node *node) { + + srand(time(NULL)); + int index = members->size() - 1; + index = rand() % index; + node->random = (*members)[index]; +} + +LinkedList * LinkedList::deep_copy() { + int length = members->size(); + std::vector *new_members = new std::vector(); + + for(int i = 0; i < length; i++) { + Node *node = new Node(); + node->data = std::string((*members)[i]->data + "'"); + new_members->push_back(node); + } + + ptrdiff_t random_index; + Node *random_node; + for(int j = 0; j < length; j++) { + random_node = (*members)[j]->next; + + random_index = std::distance (members->begin(), + std::find(members->begin(), members->end(), random_node)); + + (*new_members)[j]->random = (*new_members)[random_index]; + + if(j - 1 >= 0) { + (*new_members)[j]->next = (*new_members)[j - 1]; + } else { + (*new_members)[j]->next = NULL; + } + } + + return new LinkedList(new_members); +} diff --git a/challenge_8/cpp/manuel/src/include/LinkedList.h b/challenge_8/cpp/manuel/src/include/LinkedList.h new file mode 100644 index 000000000..aeafa6b3e --- /dev/null +++ b/challenge_8/cpp/manuel/src/include/LinkedList.h @@ -0,0 +1,36 @@ +#ifndef LINKED_LIST_H +#define LINKED_LIST_H + +class LinkedList { + + public: + + struct Node { + std::string data; + Node *next; + Node *random; + }; + + LinkedList(); + LinkedList(std::vector *); + ~LinkedList(); + + std::string data(); + void insert(std::string); + std::string pop(); + bool next(); + void random(); + void set_random(Node *); + LinkedList * deep_copy(); + + private: + + Node *head; + Node *prev_node; + Node *current_node; + + // Stores pointers to all nodes in linked list + std::vector *members; +}; + +#endif diff --git a/challenge_8/cpp/manuel/src/include/tools.h b/challenge_8/cpp/manuel/src/include/tools.h new file mode 100644 index 000000000..7e0b9f818 --- /dev/null +++ b/challenge_8/cpp/manuel/src/include/tools.h @@ -0,0 +1,11 @@ +#ifndef TOOLS_H +#define TOOLS_H + +namespace tools { + + std::vector string_to_numbers (std::string); + + +} + +#endif diff --git a/challenge_8/cpp/manuel/src/main.cpp b/challenge_8/cpp/manuel/src/main.cpp new file mode 100644 index 000000000..60bd8f502 --- /dev/null +++ b/challenge_8/cpp/manuel/src/main.cpp @@ -0,0 +1,14 @@ +#include +#include + +#include "include/tools.h" +#include "include/LinkedList.h" + +int main(int argc, char **argv) { + + LinkedList list; + list.insert("hello"); + std::cout << list.data() << std::endl; + + return 0; +} diff --git a/challenge_8/cpp/manuel/src/tools.cpp b/challenge_8/cpp/manuel/src/tools.cpp new file mode 100644 index 000000000..66e9f8445 --- /dev/null +++ b/challenge_8/cpp/manuel/src/tools.cpp @@ -0,0 +1,28 @@ +#include +#include +#include + +#include "include/tools.h" + +namespace tools { + + std::vector string_to_numbers (std::string str) { + + std::vector numbers; + std::stringstream ss(str); + int number; + + while ( ss >> number ) { + numbers.push_back(number); + + if(ss.peek() == ',') { + ss.ignore(); + } + } + + return numbers; + } + +} + + From 7fa49838be32c32092fb153bf6f9221621488542 Mon Sep 17 00:00:00 2001 From: Manuel Meraz Date: Wed, 11 Jan 2017 07:54:12 -0800 Subject: [PATCH 2/3] starting from scratch --- challenge_8/cpp/manuel/src/LinkedList.cpp | 136 ------------------ .../cpp/manuel/src/include/LinkedList.h | 36 ----- challenge_8/cpp/manuel/src/include/tools.h | 11 -- challenge_8/cpp/manuel/src/main.cpp | 14 -- challenge_8/cpp/manuel/src/tools.cpp | 28 ---- 5 files changed, 225 deletions(-) delete mode 100644 challenge_8/cpp/manuel/src/LinkedList.cpp delete mode 100644 challenge_8/cpp/manuel/src/include/LinkedList.h delete mode 100644 challenge_8/cpp/manuel/src/include/tools.h delete mode 100644 challenge_8/cpp/manuel/src/main.cpp delete mode 100644 challenge_8/cpp/manuel/src/tools.cpp diff --git a/challenge_8/cpp/manuel/src/LinkedList.cpp b/challenge_8/cpp/manuel/src/LinkedList.cpp deleted file mode 100644 index c58cd4496..000000000 --- a/challenge_8/cpp/manuel/src/LinkedList.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include -#include -#include /*srand, rand */ -#include -#include // std::remove -#include -#include // ptrdiff_t - -#include "include/LinkedList.h" - -LinkedList::LinkedList() { - head = NULL; - current_node = head; - prev_node = NULL; - members = new std::vector; - - // Array is linked list in reverse - members->push_back(head); -} - -LinkedList::LinkedList(std::vector *new_members) { - head = (*new_members)[members->size() - 1]; - current_node = head; - prev_node = NULL; - members = new_members; -} - -LinkedList::~LinkedList() { - for(Node *i:*members){ - delete i; - } - - delete[] members; -} - -std::string LinkedList::data() { - return current_node->data; -} - -void LinkedList::insert(std::string data) { - // Inserts node to front of list - // Resets random pointers to new nodes - - Node *new_node = new Node(); - new_node->data = data; - new_node->next = head; - members->push_back(new_node); - head = new_node; - - // Randomise all nodes again - while(new_node != NULL) { - set_random(new_node); - new_node = new_node->next; - } - - -} - -std::string LinkedList::pop() { - // Pops off current node from list - - // Remove from members list - members->erase(std::remove(members->begin(), members->end(), current_node), members->end()); - - // Connect previous and next node - std::string data = current_node->data; - prev_node->next = current_node->next; - - delete current_node; - return data; -} - -bool LinkedList::next() { - if(current_node->next != NULL) { - prev_node = current_node; - current_node = current_node->next; - return true; - } - - return false; -} - -void LinkedList::random() { - // Jump to random node! - - srand(time(NULL)); - int index = members->size() - 1; - index = rand() % index; - - if(index == 0) { - prev_node = NULL; - } else { - prev_node = (*members)[index - 1]; - } - - current_node = (*members)[index]; -} - - -void LinkedList::set_random(Node *node) { - - srand(time(NULL)); - int index = members->size() - 1; - index = rand() % index; - node->random = (*members)[index]; -} - -LinkedList * LinkedList::deep_copy() { - int length = members->size(); - std::vector *new_members = new std::vector(); - - for(int i = 0; i < length; i++) { - Node *node = new Node(); - node->data = std::string((*members)[i]->data + "'"); - new_members->push_back(node); - } - - ptrdiff_t random_index; - Node *random_node; - for(int j = 0; j < length; j++) { - random_node = (*members)[j]->next; - - random_index = std::distance (members->begin(), - std::find(members->begin(), members->end(), random_node)); - - (*new_members)[j]->random = (*new_members)[random_index]; - - if(j - 1 >= 0) { - (*new_members)[j]->next = (*new_members)[j - 1]; - } else { - (*new_members)[j]->next = NULL; - } - } - - return new LinkedList(new_members); -} diff --git a/challenge_8/cpp/manuel/src/include/LinkedList.h b/challenge_8/cpp/manuel/src/include/LinkedList.h deleted file mode 100644 index aeafa6b3e..000000000 --- a/challenge_8/cpp/manuel/src/include/LinkedList.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef LINKED_LIST_H -#define LINKED_LIST_H - -class LinkedList { - - public: - - struct Node { - std::string data; - Node *next; - Node *random; - }; - - LinkedList(); - LinkedList(std::vector *); - ~LinkedList(); - - std::string data(); - void insert(std::string); - std::string pop(); - bool next(); - void random(); - void set_random(Node *); - LinkedList * deep_copy(); - - private: - - Node *head; - Node *prev_node; - Node *current_node; - - // Stores pointers to all nodes in linked list - std::vector *members; -}; - -#endif diff --git a/challenge_8/cpp/manuel/src/include/tools.h b/challenge_8/cpp/manuel/src/include/tools.h deleted file mode 100644 index 7e0b9f818..000000000 --- a/challenge_8/cpp/manuel/src/include/tools.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef TOOLS_H -#define TOOLS_H - -namespace tools { - - std::vector string_to_numbers (std::string); - - -} - -#endif diff --git a/challenge_8/cpp/manuel/src/main.cpp b/challenge_8/cpp/manuel/src/main.cpp deleted file mode 100644 index 60bd8f502..000000000 --- a/challenge_8/cpp/manuel/src/main.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -#include "include/tools.h" -#include "include/LinkedList.h" - -int main(int argc, char **argv) { - - LinkedList list; - list.insert("hello"); - std::cout << list.data() << std::endl; - - return 0; -} diff --git a/challenge_8/cpp/manuel/src/tools.cpp b/challenge_8/cpp/manuel/src/tools.cpp deleted file mode 100644 index 66e9f8445..000000000 --- a/challenge_8/cpp/manuel/src/tools.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include - -#include "include/tools.h" - -namespace tools { - - std::vector string_to_numbers (std::string str) { - - std::vector numbers; - std::stringstream ss(str); - int number; - - while ( ss >> number ) { - numbers.push_back(number); - - if(ss.peek() == ',') { - ss.ignore(); - } - } - - return numbers; - } - -} - - From 8b9ae5bf28035649d2e80d109e011db48732bc8e Mon Sep 17 00:00:00 2001 From: Manuel Meraz Date: Wed, 11 Jan 2017 09:40:24 -0800 Subject: [PATCH 3/3] challenge 9 complete --- challenge_8/cpp/manuel/README.md | 22 +++++---- challenge_8/cpp/manuel/src/LinkedList.cpp | 47 +++++++++++++++++++ .../cpp/manuel/src/include/LinkedList.h | 18 +++++++ challenge_8/cpp/manuel/src/main.cpp | 41 ++++++++++++++++ 4 files changed, 119 insertions(+), 9 deletions(-) create mode 100644 challenge_8/cpp/manuel/src/LinkedList.cpp create mode 100644 challenge_8/cpp/manuel/src/include/LinkedList.h create mode 100644 challenge_8/cpp/manuel/src/main.cpp diff --git a/challenge_8/cpp/manuel/README.md b/challenge_8/cpp/manuel/README.md index 5261ff4c2..fe5874818 100644 --- a/challenge_8/cpp/manuel/README.md +++ b/challenge_8/cpp/manuel/README.md @@ -1,24 +1,28 @@ -# Challenge Name +# Random Pointer Linked List ###### C++11 @manuel ### 1. Approch to Solving the problem -Given a set of numbers ranging from 0 to N-1 with one missing number, -then the largest number in that set is the length of the array. +I assume that I am given a linked list that is prebuilt and the random +attribute always points to a random node, so I do not verify whether the +connections match. -If we find the sum of N + (N-1) + (N - 2) + ... + (N - N) = N * (N + 1) / 2, -and then iterate through the given set and subtract this value, once we -reach the end of the array the difference will be the missing number. +To make copies I map every node in the given list with a copy. + +I then iterate through my linked list and assign every attribute in +the copy to the corresponding copy of the given node. + +To test this I make a simple linked list containing all the letters +alphabet and make a copy of it to verify. ### 2. How to compile and run this code ``` make -make test make clean ``` ### 3. How this program works -Single line of input -> Single line of output - 1,3,4,0 -> 2 +This program does not take any input data and prints out +the tests I run in the main method. diff --git a/challenge_8/cpp/manuel/src/LinkedList.cpp b/challenge_8/cpp/manuel/src/LinkedList.cpp new file mode 100644 index 000000000..3a8105554 --- /dev/null +++ b/challenge_8/cpp/manuel/src/LinkedList.cpp @@ -0,0 +1,47 @@ +#include +#include + +#include "include/LinkedList.h" + +LinkedList::Node * LinkedList::copy(Node *root) { + // Assumes passed in node is prebuilt + // linked list and copies the data on it + // onto a new linked list + + std::map copies; // Maps old nodes to their copy + + Node *temp = root; // Pointer to root node + + // Allocate new memory for copy + while(temp != NULL) { + copies[temp] = new Node(); + temp = temp->next; + } + + // Reset list + temp = root; + Node *copy; + + // Copy data + while(temp->next != NULL) { + copy = copies[temp]; + copy->next = copies[temp->next]; + copy->random = copies[temp->random]; + copy->data = temp->data + "'"; + temp = temp->next; + } + return copies[root]; +} + +void LinkedList::clean(Node *root) { + // Frees the used memory by nodes + Node *temp = root->next; + + while(temp != NULL) { + root->next = temp->next; + temp->next = NULL; + temp->random = NULL; + delete temp; + temp = root->next; + } +} diff --git a/challenge_8/cpp/manuel/src/include/LinkedList.h b/challenge_8/cpp/manuel/src/include/LinkedList.h new file mode 100644 index 000000000..77bd4485b --- /dev/null +++ b/challenge_8/cpp/manuel/src/include/LinkedList.h @@ -0,0 +1,18 @@ +#ifndef LINKEDLIST_H +#define LINKEDLIST_H + +class LinkedList { + + public: + + struct Node { + std::string data; + Node *next; + Node *random; + }; + + static Node * copy(Node *); + static void clean(Node *); +}; + +#endif diff --git a/challenge_8/cpp/manuel/src/main.cpp b/challenge_8/cpp/manuel/src/main.cpp new file mode 100644 index 000000000..49cd4e198 --- /dev/null +++ b/challenge_8/cpp/manuel/src/main.cpp @@ -0,0 +1,41 @@ +#include + +#include "include/LinkedList.h" + +int main(int argc, char **argv) { + LinkedList::Node *list = new LinkedList::Node(); + + // Build dummy list + LinkedList::Node *temp = list; + for(char letter = 'A'; letter <= 'Z'; letter++) { + temp->data = letter; + temp->next = new LinkedList::Node(); + temp = temp->next; + } + + // Iterate through list + temp = list; + while(temp != NULL) { + std::cout << temp->data << " "; + temp = temp->next; + } + std::cout << std::endl; + + // Make copy + LinkedList::Node *copy = LinkedList::copy(list); + + // Iterate through copy + temp = copy; + while(temp != NULL) { + std::cout << temp->data << " "; + temp = temp->next; + } + std::cout << std::endl; + + LinkedList::clean(list); // deallocate memory + LinkedList::clean(copy); + delete copy; + delete list; + return 0; +} +