using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
namespace
Reversals
{
class
Program
{
static
void
Main(
string
[] args)
{
int
[] array1 =
new
int
[] { 0, 1, 2, 3, 7, 6, 5, 4, 9, 8, 10 };
Console.WriteLine(
"Before: "
+
string
.Join(
", "
, array1));
SolveByReversals1(array1);
Console.WriteLine(
" After: "
+
string
.Join(
", "
, array1));
Console.WriteLine();
int
[] array2 =
new
int
[] { 0, 1, 2, 3, 7, 6, 5, 4, 9, 8, 10 };
Console.WriteLine(
"Before: "
+
string
.Join(
", "
, array2));
SolveByReversals1(array2);
Console.WriteLine(
" After: "
+
string
.Join(
", "
, array2));
int
[] array3 =
new
int
[] { 0, 10, 20, 30, 70, 60, 50, 40, 90, 80, 100 };
Console.WriteLine(
"Before: "
+
string
.Join(
", "
, array3));
SolveByReversals2(array3);
Console.WriteLine(
" After: "
+
string
.Join(
", "
, array3));
Console.WriteLine();
int
[] array4 =
new
int
[] { 0, 1, 2, 3, 7, 6, 5, 4, 9, 8, 10 };
Console.WriteLine(
"Before: "
+
string
.Join(
", "
, array4));
SolveByReversals3(array4);
Console.WriteLine(
" After: "
+
string
.Join(
", "
, array4));
int
[] array5 =
new
int
[] { 0, 10, 20, 30, 70, 60, 50, 40, 90, 80, 100 };
Console.WriteLine(
"Before: "
+
string
.Join(
", "
, array5));
SolveByReversals3(array5);
Console.WriteLine(
" After: "
+
string
.Join(
", "
, array5));
int
[] array6 =
new
int
[] { 0, 0, 1, 4, 3, 3, 1, 2, 2, 4 };
Console.WriteLine(
"Before: "
+
string
.Join(
", "
, array6));
SolveByReversals3(array6);
Console.WriteLine(
" After: "
+
string
.Join(
", "
, array6));
}
/// <summary>
/// Works only for perfect sequences starting at zero
/// and incrementing by one {0,1,2,3,...,10,...}
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public
static
int
[] SolveByReversals1(
int
[] array)
{
for
(
int
i = 0; i < array.Length; i++)
{
int
j = Array.IndexOf<
int
>(array, i);
Array.Reverse(array, i, j - i + 1);
}
return
null
;
}
/// <summary>
/// Works with sequences of unique integers.
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public
static
int
[] SolveByReversals2(
int
[] array)
{
int
pos = 0;
for
(
int
i = 0; i < array.Max() - 1; i++)
{
int
j = Array.IndexOf<
int
>(array, i, pos);
if
(j == -1)
continue
;
Array.Reverse(array, pos, j - pos + 1);
pos++;
}
return
null
;
}
/// <summary>
/// Works for numbers of any sequence.
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public
static
int
[] SolveByReversals3(
int
[] array)
{
int
pos = 0;
int
highLoop = array.Max();
if
(array.Length > highLoop)
highLoop = array.Length;
for
(
int
i = 0; i < array.Max() - 1; i++)
{
int
j = 0;
while
((j = Array.IndexOf<
int
>(array, i, pos)) != -1)
{
Array.Reverse(array, pos, j - pos + 1);
pos++;
}
}
return
null
;
}
}
}