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

    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

    大家有好的想法写出来,学习学习...

  • 相关阅读:
    WF 学习笔记 (1) 浅谈 WF 和 MVC 架构
    从HelloWorld看iphone程序的生命周期
    android开发我的新浪微博客户端阅读微博UI篇(6.1)
    关于微博服务端API的OAuth认证实现
    iphone开发我的新浪微博客户端开篇
    一个完整的新浪微博客户端android版OAuth认证示例
    android开发我的新浪微博客户端OAuth认证过程中用WebView代替原来的系统自带浏览器
    iphone开发我的新浪微博客户端用户登录准备篇(1.1)
    android开发我的新浪微博客户端登录页面功能篇(4.2)
    android开发我的新浪微博客户端登录页面UI篇(4.1)
  • 原文地址:https://www.cnblogs.com/jasenkin/p/find_deleted_elements.html
Copyright © 2011-2022 走看看