// http://www.impactinterview.com/2009/10/140-google-interview-questions/#software_engineer
// Write a function f(a, b) which takes two character string arguments and returns a string containing
// only the characters found in both strings in the order of a. Write a version which is order N-squared
// and one which is order N.
#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <cstring>
std::string match_the_stupid_way(std::string a, std::string b)
{
// the silly way is just for each char in string a O(n)
// look through string b O(n) double loop hence O(n^2)
std::string res;
for (std::string::iterator ait = a.begin();
ait != a.end();
++ait)
{
// ok match the first each char
std::string::iterator bit = b.begin();
while (bit != b.end() and
*bit != *ait)
{
++bit;
}
if (bit != b.end())
res += *ait;
}
return res;
}
std::string match_the_fast_way(std::string a, std::string b)
{
// O(N) .. this imples reading over a string (which takes O(N)) and
// digesting into an O(1) data struture and then check over the other...
// well an O(1) data structure is a hash or table..
std::vector<bool> found_char(256,false);
// the O(N) read is
for (std::string::iterator bit = b.begin();
bit != b.end();
++bit)
{
found_char[*bit] = true;
}
// and the second O(N) check is
std::string res;
for (std::string::iterator ait = a.begin();
ait != a.end();
++ait)
{
if (found_char[*ait])
res += *ait;
}
return res;
}
void test(std::function<std::string (std::string,std::string)> func,
std::string a,
std::string b,
std::string exp)
{
std::string out = func(a,b);
std::cout << (out == exp ? "passed" : "FAILED")
<< " a:\"" << a
<< "\" b:\"" << b
<< "\" out:\"" << out
<< "\" exp:\"" << exp
<< "\"\n";
}
void test_set(std::function<std::string (std::string,std::string)> func)
{
test(func, "a", "cba", "a");
test(func, "aaa", "cba", "aaa"); // hmm question isnt clear on repeats.. assume it does repeats
test(func, "abcdefg", "gfedcba", "abcdefg");
test(func, "the quick brown fox", "peter piper picked a pepper", "te ick r ");
std::cout << "*** SET DONE ***\n";
}
int main()
{
test_set(match_the_stupid_way);
test_set(match_the_fast_way);
}
Output is
passed a:"a" b:"cba" out:"a" exp:"a" passed a:"aaa" b:"cba" out:"aaa" exp:"aaa" passed a:"abcdefg" b:"gfedcba" out:"abcdefg" exp:"abcdefg" passed a:"the quick brown fox" b:"peter piper picked a pepper" out:"te ick r " exp:"te ick r " *** SET DONE *** passed a:"a" b:"cba" out:"a" exp:"a" passed a:"aaa" b:"cba" out:"aaa" exp:"aaa" passed a:"abcdefg" b:"gfedcba" out:"abcdefg" exp:"abcdefg" passed a:"the quick brown fox" b:"peter piper picked a pepper" out:"te ick r " exp:"te ick r " *** SET DONE ***
No comments:
Post a Comment