First interview was with an external recruiter and was very friendly. Questions about my past and what I would like to do in the future. Standard but positive.
Second interview was also nice and consisted mainly on a logic challenge. Nothing too difficult and the interviewer was very helpful. Received an e-mail with an encouraging feedback, they were happy.
Third interview had three parts. Parts 1 and 2 were in the same call (1 hour). Part 3 was the next day (30 mins):
Part 1 - Some questions about my background, then Java and best practices in general. Nailed this part, I'm sure I've exceeded the interviewers' expectations in every aspect. This part probably took longer than the interviewer was expecting, taking me some precious time for part 2.
Part 2 - Implementation of a graph algorithm with screen sharing. With limited time, I didn't manage to finish the algorithm but the interviewer said that I was on the right track and would finish on the next day. After the call, I've received another very positive feedback and an invite for the next day to conclude.
Part 3 - I've finished the algorithm that we had started the day before and was given another one, also with graphs, which I didn't have enough time to finish.
It true that I've been defeated by this last graph algorithm - or by the limited time - but I wonder how clever it is to discard a programmer that has nailed everything else just because of that.
The news came with a feedback to the effect that they were impressed by everything but "we have concluded that this is not the right fit at this time". This is clearly not true, I was rejected because my background is not exactly computer science and this is clearly what they are looking for. Being an excellent programmer won't help you at all, theory is the only thing that matters here.