## BFS/DFS/TopSort

0 likes • Apr 30, 2021
C++

## More C++ Posts

```/*Good morning! Here's your coding interview problem for today.
This problem was asked by Stripe.
Given an array of integers, find the first missing positive integer in linear time and constant space. In other words, find the lowest positive integer that does not exist in the array. The array can contain duplicates and negative numbers as well.
For example, the input [3, 4, -1, 1] should give 2. The input [1, 2, 0] should give 3.
You can modify the input array in-place.*/#include <iostream>using namespace std;
int calcMissing(int* input, int size){	int sum = 0;	int n = 1; //add one to account for missing value	for(int i = 0; i < size; i++)	{	if(input[i] > 0)	{	sum += input[i];	n++;	}	}
//If no numbers higher than 0, answer is 1	if(sum == 0)	return 1;
return (n*(n+1)/2) - sum; //Formula is expectedSum - actualSum	/* expectedSum = n*(n+1)/2, the formula for sum(1, n) */}
int main(){
cout << calcMissing(new int{3, 4, -1, 1}, 4) << endl;	cout << calcMissing(new int{1, 2, 0}, 3) << endl;
//No positive numbers	cout << calcMissing(new int{0}, 1) << endl;}```
```#include <iostream>using namespace std;
int main(){    cout << "Hello, World!" << endl;    return 0;}```
```#include <string>#include <iostream>#include "PlaylistNode.h"using namespace std;
PlaylistNode::PlaylistNode() {   uniqueID = "none";   songName = "none";   artistName = "none";   songLength = 0;   nextNodePtr = 0;}
PlaylistNode::PlaylistNode(string uniqueID_, string songName_, string artistName_, int songLength_) {   uniqueID = uniqueID_;   songName = songName_;   artistName = artistName_;   songLength = songLength_;   nextNodePtr = 0;}
void PlaylistNode::InsertAfter(PlaylistNode* ptr) {   this->SetNext(ptr->GetNext());   ptr->SetNext(this);}
void PlaylistNode::SetNext(PlaylistNode* ptr) {   nextNodePtr = ptr;}
string PlaylistNode::GetID() {   return uniqueID;}
string PlaylistNode::GetSongName() {   return songName;}
string PlaylistNode::GetArtistName() {   return artistName;}
int PlaylistNode::GetSongLength() {   return songLength;}
PlaylistNode* PlaylistNode::GetNext() {   return nextNodePtr;}
void PlaylistNode::PrintPlaylistNode() {   cout << "Unique ID: " << uniqueID << endl;   cout << "Song Name: " << songName << endl;   cout << "Artist Name: " << artistName << endl;   cout << "Song Length (in seconds): " << songLength << endl;}
Playlist::Playlist() {   head = tail = 0;}
void Playlist::AddSong(string id, string songname, string artistname, int length) {   PlaylistNode* n = new PlaylistNode(id, songname, artistname, length);   if (head == 0) {      head = tail = n;   }   else {      n->InsertAfter(tail);      tail = n;   }}
bool Playlist::RemoveSong(string id) {   if (head == NULL) {      cout << "Playlist is empty" << endl;      return false;   }      PlaylistNode* curr = head;   PlaylistNode* prev = NULL;   while (curr != NULL) {      if (curr->GetID() == id) {         break;      }      prev = curr;      curr = curr->GetNext();   }      if (curr == NULL) {      cout << "\"" << curr->GetSongName() << "\" is not found" << endl;      return false;   }   else {      if (prev != NULL) {         prev ->SetNext(curr->GetNext());      }      else {         head = curr->GetNext();      }      if (tail == curr) {         tail = prev;      }      cout << "\"" << curr->GetSongName() << "\" removed." << endl;      delete curr;      return true;   }}
bool Playlist::ChangePosition(int oldPos, int newPos) {   if (head == NULL) {      cout << "Playlist is empty" << endl;      return false;   }      PlaylistNode* prev = NULL;   PlaylistNode* curr = head;      int pos;   if (head == NULL || head == tail) {      return false;   }      for (pos = 1; curr != NULL && pos < oldPos; pos++) {      prev = curr;      curr = curr->GetNext();   }   if (curr != NULL) {      string currentSong = curr->GetSongName();            if (prev == NULL) {         head = curr->GetNext();      }      else {         prev->SetNext(curr->GetNext());      }      if (curr == tail) {         tail = prev;      }            PlaylistNode* curr1 = curr;      prev = NULL;      curr = head;      for (pos = 1; curr != NULL && pos < newPos; pos++) {         prev = curr;         curr = curr->GetNext();      }      if (prev == NULL) {         curr1->SetNext(head);         head = curr1;      }      else {         curr1->InsertAfter(prev);      }      if (curr == NULL) {         tail = curr1;      }      cout << "\"" << currentSong << "\" moved to position " << newPos << endl;      return true;   }   else {      cout << "Song's current position is invalid" << endl;      return false;   }}
void Playlist::SongsByArtist(string artist) {   if (head == NULL) {      cout << "Playlist is empty" << endl;   }   else {      PlaylistNode* curr = head;      int i = 1;      while (curr != NULL) {         if (curr->GetArtistName() == artist) {            cout << endl << i << "." << endl;            curr->PrintPlaylistNode();         }         curr = curr->GetNext();         i++;      }   }}
int Playlist::TotalTime() {   int total = 0;   PlaylistNode* curr = head;      while (curr != NULL) {      total += curr->GetSongLength();      curr = curr->GetNext();   }   return total;}
void Playlist::PrintList() {   if (head == NULL) {      cout << "Playlist is empty" << endl;   }   else {      PlaylistNode* curr = head;      int i = 1;      while (curr != NULL) {         cout << endl << i++ << "." << endl;         curr->PrintPlaylistNode();         curr = curr->GetNext();      }   }}```
```//Get data file at https://codecatch.net/post.php?postID=91e87d73//Iteration 1 of Wing Project. Solution breaks down around n=35
#include <iostream>#include <fstream>#include <string>#include <vector>#include <map>using namespace std;
int getSum(map<int, int> list);void readData(map<int, float>* data);void lowestPrice();void findSums(int n, vector<map<int, int>>* sumsList, map<int, float>* data);//void findSum(map<int, int> currList, int x, int n, vector<map<int, int>>* sumsList);void findSum(map<int, int> currList, int x, int n, vector<map<int, int>>* sumsList, map<int, float>* data);float getPrice(map<int, int> set, map<int, float>* data);
template <typename S>ostream& operator<<(ostream& os, const vector<S>& vector){	// Printing all the elements using <<	for (auto element : vector) {	os << element << " ";	}	return os;}
bool operator==(map<int, int> m1, map<int, int> m2){	if(m1.size() != m2.size())	return false;
bool ret = true;
for(auto it = m1.begin(); it !=m1.end() && ret; it++)	{	if(ret && m1.count(it->first) != m2.count(it->first))	ret = false;
if(ret && m1.count(it->first) == 1)	{	if(m1.at(it->first) != m2.at(it->first))	ret = false;	}	}
return ret;}

int main(){	map<int, float> data;	readData(&data);
vector<map<int, int>> *sumsList;	sumsList = new vector<map<int, int>>;	findSums(40, sumsList, &data);
for(auto el : *sumsList)	{	for(auto it = el.begin(); it != el.end(); it++)	{	cout << it->first << "->" << it->second << " ";	}	cout << getPrice(el, &data) << endl;	}
return 0;}
/* Returns the price of wings given a set of numbers of wings to buy.	* Returns -1 if the set contains a number that is not possible to buy.	*/float getPrice(map<int, int> set, map<int, float>* data){	float price = 0;	for(auto it = set.begin(); it != set.end(); it++)	{	//If data doesn't contain an element of set, return -1	if(data->count(it->first) == 0)	return -1;		price += data->at(it->first) * it->second; //pricePerPacket * qtyOfPackets	}
return price;}
/* Adds the elements of list.	* Suppose mapping is <num, qty>.	* Returns sum(num*qty)	*/int getSum(map<int, int> list){	int sum = 0;	for(auto it = list.begin(); it != list.end(); it++)	sum += it->first * it->second;	return sum;}
void findSums(int n, vector<map<int, int>>* sumsList, map<int, float>* data){	map<int, int> currList;
//Recur when currSum < n	auto it = data->begin();	while(it->first <= n && it != data->end())	{	findSum(currList, it->first, n, sumsList, data);	it++;	}}
void findSum(map<int, int> currList, int x, int n, vector<map<int, int>>* sumsList, map<int, float>* data){	//Append x to currList	if(currList.count(x) == 0)	currList.emplace(x, 1);	else	{	int val = 1+ currList.at(x);	currList.erase(x);	currList.emplace(x, val);	}
//Determine current sum, check for return cases	int currSum = getSum(currList);
if(currSum > n)	return;	else if(currSum == n)	{
//Check to make sure no duplicates	for(auto list : *sumsList)	{	if(list == currList)	return;	}
sumsList->push_back(currList);	return;	}
//Recur when currSum < n	auto it = data->begin();	while(it->first <= n-x && it != data->end())	{	findSum(currList, it->first, n, sumsList, data);	it++;	}}
void readData(map<int, float>* data){	ifstream file ("./data", ifstream::in);
if(file.is_open())	{	int i = 0;	while(!file.eof())	{	float wings, price;	string skipnl;	file >> wings;	file >> price;
data->emplace(wings, price);
getline(file, skipnl);	i++;	}	}}```
```#include <iostream>using namespace std;
main{	cout << "No tabbing. That's very sad :(\n";	cout << "No in-editor highlighting either :(((\n";	cout << "Descriptions might be niice too.";}```
```#include <iostream>#include <fstream>#include <string>#include <cstring>
using namespace std;
//This program makes a new text file that contains all combinations of two letters.// aa, ab, ..., zy, zz
int main(){	string filename = "two_letters.txt";
ofstream outFile;	outFile.open(filename.c_str());
if(!outFile.is_open()){		cout << "Something's wrong. Closing..." << endl;		return 0;	}
for(char first = 'a'; first <= 'z'; first++){		for(char second = 'a'; second <= 'z'; second++){			outFile << first << second << " ";		}		outFile << endl;	}
return 0;}```