一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
2013-07-18 20:53
519 查看
1、对于一组连续的数据,打乱次序后,随机取出某一个数字(取出数字后,该位置后的所有数字位置前进一位),用最简单的方法查找出取出的数字。
2、对1的扩展,当取出多个数据后,用最简单的方法查找出取出的数字。
本人开始对于1的情况,将这种场景抽象成通用的模型,跳进了思维陷阱,把2倒是想出来了,晕了....
大家也可以先试着写写,以下的代码并不是最好的(纯粹的测试代码),只作为参考而已。
对于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 ProgramProgram 大家有好的想法写出来,学习学习...
{
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;
}
}
相关文章推荐
- 一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字(数组指针的方法)
- 程序员面试金典——解题总结: 9.18高难度题 18.9随机生成一些数字并传入某个方法。编写一个程序,每当收到新数字时,找出并记录中位数。
- 6.用插入排序对任意一组随机数据进行随机数组进行排序(用循环和递归两种方法)
- shuffle:随机打乱一个数组的顺序的另一种方法
- 一个取数据集中指定一段记录的简单方法
- 【数据结构作业六a】建立一个顺序表,用顺序查找、折半查找的方法对其实施查找
- 编程实现: 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)
- 随机打乱一组数据(算法)
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。
- 一个简单的全字查找与匹配方法
- 输入连续有序数组,数组中有一个数字丢失,二分查找
- 一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的。
- C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,
- 一组数据中只有一个数字出现了一次和 一组数据中只有两个个数字出现了一次其他所有数字都是成对出现的。请找出这个数字
- 一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的。 请找出这个数字。
- 一个限制输入框只能输入数字的简单方法
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。
- 将一个文本打乱顺序的简单方法
- 给你一组随机的数字,你需要判断这组数是否是连续的做法?