## Saturday, July 2, 2016

### Google interview question: write an execl col label to integer converter

// http://www.impactinterview.com/2009/10/140-google-interview-questions/#software_engineer
// Write a function (with helper functions if needed) called to Excel that takes an excel column value
// (A,B,C,D…AA,AB,AC,… AAA..) and returns a corresponding integer value (A=1,B=2,… AA=26..).

#include <iostream>
#include <stdexcept>

// the function "toExecl" will convert *from* excel format to integers... ignoring that confusion...
int fromExcel(std::string val)
{
// there is an oddity here
// 0A -> A but A0 -> doesnt exist! note the +1 in the conversion line as a result

int out = 0;
for (std::string::iterator vit = val.begin();
vit != val.end();
++vit)
{
if (*vit < 'A' or *vit > 'Z')
throw std::runtime_error("doesnt look like an execl col");
out = (out*26) + (*vit - 'A' + 1);
}

return out;
}

int test(std::string in, int exp)
{
int out = fromExcel(in);

std::cout << (out == exp ? "passed" : "FAILED")
<< " in:" << in
<< " out:" << out
<< " exp:" << exp
<< "\n";
}

int main()
{
try
{
test("012", 0);
std::cout << "FAILED: did not detect bad inputs\n";
}
catch (std::exception& e)
{
std::cout << "pass: throw check worked\n";
}

test(  "A",                     1);
test(  "Z",                    26);
test( "AA",             1*26 +  1);
test( "AZ",             1*26 + 26);
test( "BA",             2*26 +  1);
test( "ZZ",            26*26 + 26);
test("AAA", 1*26*26 +   1*26 +  1);
test("AZZ", 1*26*26 +  26*26 + 26);
test("ZAA",26*26*26 +   1*26 +  1);
test("ZZZ",26*26*26 +  26*26 + 26);
}


Output

pass: throw check worked
passed in:A out:1 exp:1
passed in:Z out:26 exp:26
passed in:AA out:27 exp:27
passed in:AZ out:52 exp:52
passed in:BA out:53 exp:53
passed in:ZZ out:702 exp:702
passed in:AAA out:703 exp:703
passed in:AZZ out:1378 exp:1378
passed in:ZAA out:17603 exp:17603
passed in:ZZZ out:18278 exp:18278