您的位置:首页 > 其它

一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)

2013-07-17 23:58 666 查看
1、对于一组连续的数据,打乱次序后,随机取出某一个数字(取出数字后,该位置后的所有数字位置前进一位),用最简单的方法查找出取出的数字。

2、对1的扩展,当取出多个数据后,用最简单的方法查找出取出的数字。

本人开始对于1的情况,将这种场景抽象成通用的模型,跳进了思维陷阱,把2倒是想出来了,晕了....

大家也可以先试着写写,以下的代码并不是最好的(纯粹的测试代码),只作为参考而已。

对于1的代码如下:

class Program
{
static void Main(string[] args)
{
int firstValue = -40;
int totalLength = 20;

FindDeletedOneElement(totalLength, firstValue, 12);

FindDeletedElements(totalLength, firstValue, 10, 7);

Console.ReadLine();
}

private static IList<int> FindDeletedElements(int totalLength, int firstValue, int exchangeCount, int deleteCount)
{
if (totalLength <= 0)
{
return null;
}

int[] array = CreateArray(totalLength, firstValue);

int length = array.Length;
int[] arrayCopy = new int[length];
array.CopyTo(arrayCopy, 0);

Exchange(ref array, exchangeCount);
DeleteData(ref array, deleteCount);

int?[] arrayFilled = new int?[length];

for (int index = 0; index < array.Length; index++)
{
int currentValue = array[index];
int position = currentValue - firstValue;
arrayFilled[position] = currentValue;
}

IList<int> deletedValues = new List<int>();

for (int index = 0; index < length; index++)
{
if (arrayFilled[index] == null)
{
deletedValues.Add(index + firstValue);
}
}

Output(arrayCopy, "Copy Array:");
Output(array, "Original Array:");
Output(deletedValues, "DELETED VALUES:");

return deletedValues;
}

private static void DeleteData(ref int[] array, int count)
{
if (array == null || array.Length == 0
|| count < 1 || count > array.Length)
{
return;
}

Random random = new Random();

for (int index = 0; index < count; index++)
{
int randomIndex = random.Next(0, array.Length);

DeleteRandomIndexData(ref array, randomIndex);
}
}

public static int? FindDeletedOneElement(int totalLength, int firstValue, int exchangeCount)
{
if (totalLength <= 0)
{
return null;
}

int[] array = CreateArray(totalLength, firstValue);

int length = array.Length;
int[] arrayCopy = new int[length];
array.CopyTo(arrayCopy, 0);

Exchange(ref array, exchangeCount);

Random random = new Random();
int randomIndex = random.Next(0, length);

DeleteRandomIndexData(ref array, randomIndex);

int deletedValue = 0;
int arrayResultLength = array.Length;

for (int index = 0; index < length; index++)
{
if (index < arrayResultLength)
{
deletedValue -= array[index];
}

deletedValue += arrayCopy[index];
}

Output(arrayCopy, "Copy Array:");
Output(array, "Original Array:");
Output(new List<int>() { deletedValue }, "DELETED VALUES:");

return deletedValue;
}

private static void Output(IList<int> deletedValues, string title)
{
if (deletedValues == null)
{
return;
}

StringBuilder builder = new StringBuilder();
builder.AppendLine(title);

foreach (int value in deletedValues)
{
builder.Append(value + "  ");
}

builder.AppendLine();

Console.Write(builder);
}

private static void Exchange(ref int[] array, int count)
{
if (array == null || array.Length <= 1 || count <= 0)
{
return;
}

Random randomIndex = new Random();

for (int index = 0; index < count; index++)
{
int startIndex = randomIndex.Next(0, array.Length);
Thread.Sleep(100);
int endIndex = randomIndex.Next(0, array.Length);

if (startIndex == endIndex)
{
continue;
}

int tempValue = array[startIndex];
array[startIndex] = array[endIndex];
array[endIndex] = tempValue;
}
}

private static void DeleteRandomIndexData(ref int[] array, int randomIndex)
{
if (array == null)
{
return;
}

int length = array.Length;

if (randomIndex < 0 || randomIndex >= length)
{
return;
}

for (int index = randomIndex; index < length - 1; index++)
{
array[index] = array[index + 1];
}

array = array.Take(length - 1).ToArray();
}

private static int[] CreateArray(int count, int startValue)
{
if (count <= 0)
{
return new int[0];
}

int[] array = new int[count];

for (int index = 0; index < count; index++)
{
array[index] = startValue;
startValue++;
}

return array;
}
}


Program
大家有好的想法写出来,学习学习...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐