一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
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; }
对于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; }
所有代码如下:

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; } }
大家有好的想法写出来,学习学习...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架