Прежде чем я начну ... В этом вопросе есть двусмысленность, которая может заключаться в том, что интервьюер был более заинтересован, чем ответ. Это может показаться вопросом вопроса о способе проверки одного конкретного расположения значений, за исключением бита, который говорит «Возможно ли построить пирамиду из 6 домино в описанном порядке выше? Домино можно свободно размещать и вращать. ", что означает, что они могут попросить вас также перемещать домино, чтобы найти решение. Я собираюсь игнорировать это и придерживаться простой проверки того, является ли это действительным соглашением. (Если требуется , я бы разбил массив на пары, а затем перебил все возможные варианты для этого кода, чтобы найти первый действительный код.)
Я выбрал C # в качестве языка для своего решения, но я намеренно избегал любых языковых функций, которые могли бы сделать это более читабельным для человека C # или работать быстрее, поскольку вопрос не зависит от языка, поэтому я хотел это должно быть читаемым / конвертируемым для людей, которые предпочитают другие языки. По этой же причине я использовал много именованных переменных.
В основном проверьте, что каждая строка дублируется в строке ниже (смещение на единицу), и остановитесь, когда вы достигнете последней строки.
Алгоритм отключается, как только обнаруживает ошибку. Этот алгоритм расширяем для больших пирамид; но не проверяет размер входного массива: он будет работать, если массив разумный.
using System;
public static void Main()
{
int[] values = new int[] { 3, 4, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6 };
bool result = IsDominoPyramidValid(values);
Console.WriteLine(result ? "YES" : "NO");
}
private const int DominoLength = 2;
public static bool IsDominoPyramidValid(int[] values)
{
int arrayLength = values.Length;
int offset = 0;
int currentRow = 1; // Note: I'm using a 1-based value here as it helps the maths
bool result = true;
while (result)
{
int currentRowLength = currentRow * DominoLength;
// Avoid checking final row: there is no row below it
if (offset + currentRowLength >= arrayLength)
{
break;
}
result = CheckValuesOnRowAgainstRowBelow(values, offset, currentRowLength);
offset += currentRowLength;
currentRow++;
}
return result;
}
private static bool CheckValuesOnRowAgainstRowBelow(int[] values, int startOfCurrentRow, int currentRowLength)
{
int startOfNextRow = startOfCurrentRow + currentRowLength;
int comparablePointOnNextRow = startOfNextRow + 1;
for (int i = 0; i < currentRowLength; i++)
{
if (values[startOfCurrentRow + i] != values[comparablePointOnNextRow + i])
{
return false;
}
}
return true;
}