一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
2013-07-17 23:58
666 查看
1、对于一组连续的数据,打乱次序后,随机取出某一个数字(取出数字后,该位置后的所有数字位置前进一位),用最简单的方法查找出取出的数字。
2、对1的扩展,当取出多个数据后,用最简单的方法查找出取出的数字。
本人开始对于1的情况,将这种场景抽象成通用的模型,跳进了思维陷阱,把2倒是想出来了,晕了....
大家也可以先试着写写,以下的代码并不是最好的(纯粹的测试代码),只作为参考而已。
对于1的代码如下:
Program
大家有好的想法写出来,学习学习...
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
大家有好的想法写出来,学习学习...
相关文章推荐
- 一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字(数组指针的方法)
- C++之String的find方法,查找一个字符串在另一个字符串的什么位置;leveldb字符串转数字解析办法
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。
- 一个简单的方法查询一列数据为一行
- 将m,n(m>n)的连续自然数序列,打乱顺序重新排列,随机取出一个数,试问取出的这个数是多少?使用一种解法,时间复杂度O(m-n),空间复杂度O(1)
- C语言:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- php简单生成一组与多组随机字符串的方法
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的,求这个数字。(使用位运算)
- 简单洗牌(打乱52个随机生成的数字)
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- 数组成员打乱顺序的一个简单的方法
- 设计一个类,该类中有一个方法,该方法使用Random类随机产生10个三位数字(如636)的随机数,并把产生的10个随机数存入数组中。然后在另一个类中输出这10个数
- java String.indexOf方法在一个字符串中查找另一个字符串的次数的简单应用
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- 数据结构——算法之(005)(输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字)
- 一个简单的将数字转化为汉字大写的方法
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(使用位运算)