您的位置:首页 > 其它

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

2013-07-18 20:53 519 查看
1、对于一组连续的数据,打乱次序后,随机取出某一个数字(取出数字后,该位置后的所有数字位置前进一位),用最简单的方法查找出取出的数字。
2、对1的扩展,当取出多个数据后,用最简单的方法查找出取出的数字。
本人开始对于1的情况,将这种场景抽象成通用的模型,跳进了思维陷阱,把2倒是想出来了,晕了....
大家也可以先试着写写,以下的代码并不是最好的(纯粹的测试代码),只作为参考而已。
对于1的代码如下:




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;
        }
FindDeletedOneElement 对于2的代码如下:




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;
        }
FindDeletedElements 所有代码如下:




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