views:

167

answers:

4

I was browsing SO careers and came across a job that had a pdf with a couple of puzzles they wanted applicants to send in.

Although I'm not interested in the job, I read the questions anyway and had a play in Visual Studio / SMSS. The first question was fairly easy to solve although I couldn't think if any way to optimise it (I solved it in C#). The second puzzle only one obvious solution strikes me and I can't think of any others.

I'm not sure if it's bad to discuss these questions here though, but if anyone can give me some hints or perhaps suggest somewhere where I can ask this without creating any grief it'd be appreciated.

The questions are in here: http://www.debtx.com/doc/DebtX_Programming_Problems.pdf

I could let the first one slide but the second one has me stumped on other ways of solving it than the obvious. Shame there's no PM function on SO...

Boilerplate solution for the first part C#:

public static bool Compare(int[] num, int[] div)
{
    for (int i = 0; i < num.Length; i++)
    {
        for (int j = 0; j < div.Length; j++)
        {
            if (num[i] % div[j] == 0)
                return true;
        }
    }

    return false;
}

My SQL Solutions

select Table1.Key1, Table1.Key2 from Table1 inner join Table2 on Table1.Key1 = Table2.key2 where IsDeleted=0

select * from Table1 where key1 in(select Key2 from Table2 where IsDeleted=0)

It all seems so samey though

+4  A: 

couple of examples using pseudo SQL to not give too much away

Not In

   SELECT * FROM TBL1 
   WHERE NOT IN (
            SELECT FROM TBL2  
            WHERE Deleted=0 AND Tbl2.Key1= Tbl1.Key1 AND Tbl2.Key2=Tbl1.Key2
            )

Not Exists

    SELECT * FROM TBL1 
    WHERE NOT EXISTS (
        SELECT FROM TBL2 
        WHERE Deleted =0 AND Tbl2.Key1= Tbl1.Key1 AND Tbl2.Key2=Tbl1.Key2
        ) 

Outter Join Is Null

    SELECT * FROM TBL1 LEFT JOIN TBL2 
    WHERE TBL2.Key1 IS NULL OR Deleted=0
Gavin Draper
+1 This is an answer to the actual question in the title, and I'm imagining from their "there are at least three answers!" that they're looking for not in/not exists/join.
Marc Bollinger
+1  A: 

Well which solution have you used already? Immediately I think it can be done using a subquery with IN, using a LEFT OUTER JOIN and filtering on NULL, or using EXISTS.

Nick
+2  A: 

One optimisation to the C# question is to sort the DIV array. You're more likely to find a match quickly starting with the smaller numbers.

EDIT: Another optimisation to the C# question may be to look at an approach similar to the Prime Number Sieve of Eratosthenes the general theory being that you pre-empt some results without having to perform the checks.

As for the SQL question, the three obvious (common) ways are as others have stated, a JOIN, an IN and an EXISTS.

Robin Day
Yeah that's what I thought, sorting the array. It's only an optimisation though if the Compare method is executed more than once
SLC
You can even remove all numbers from div which are multiples to another number of div. e.g. when you have 3 you can remove 6, 9, 12, 15, ... when a number is not dividable by 3 it will not be dividable by 6, 9, 12, 15, ... too
tanascius
@tanascius I was just adding that to the answer :) The Seive of Eratosthenes.
Robin Day
+1  A: 

Spoiler alert!!!!!
















SELECT
     T1.key1,
     T1.key2
FROM
    Table1 T1
WHERE
    NOT EXISTS
    (
        SELECT *
        FROM
            Table2 T2
        WHERE
            T2.key1 = T1.key1 AND
            T2.key2 = T1.key2 AND
            COALESCE(T2.IsDeleted, 0) <> 1
    )

SELECT
     T1.key1,
     T1.key2
FROM
    Table1 T1
LEFT OUTER JOIN Table2 T2 ON
    T2.key1 = T1.key1 AND
    T2.key2 = T1.key2 AND
    COALESCE(T2.IsDeleted, 0) <> 1
WHERE
    T2.key1 IS NULL

SELECT
     T1.key1,
     T1.key2
FROM
    Table1 T1
WHERE
    (
        SELECT COUNT(*)
        FROM
            Table2 T2
        WHERE
            T2.key1 = T1.key1 AND
            T2.key2 = T1.key2 AND
            COALESCE(T2.IsDeleted, 0) <> 1
    ) = 0
Tom H.