• C#面试题: 寻找中间值


    给定一个升序数组,在区间内从左到右查找中间值,每次查找最小值与最大值区间内的中间值,且这个区间元素数量不小于3。

    例如

    1.给定数组float[] data = { 1, 2.3f, 4, 5.75f, 8.125f, 10.5f, 13, 15, 20 }

    输出:10.5、5.75、4、2.3、8.125、15、13

    解释:

    1)(20+1)/2=10.5,首先从整个数组中获取中间值;

    2)(10.5+1)/2=5.75,从左边开始计算,左边为1,也就是区间[1,10.5],此区间元素数量大于2,因此需要计算;

    3)(1+5.75)/2=3.375,左边为1,也就是区间[1,5.75],此区间元素数量大于2,因此需要计算;数组中不存在3.375,找最接近的4;

    4)(1+4)/2=2.5,,左边为1,也就是区间[1,4],此区间元素数量大于2,因此需要计算;数组中不存在2.5,找最接近的2.3;

    左边查找结束,查找右边

    5)(5.75+10.5)/2=8.125,区间[5.75,10.5],此区间元素数量大于2,因此需要计算;

    6)8.125与10.5,区间[8.125,10.5],此区间元素数量等于2,因此不需要计算;

    7)(10.5+20 )/2=15.25,区间[10.5,20],此区间元素数量大于2,因此需要计算;数组中不存在,找最接近的15

    8)(10.5+15)/2=12.75,先找左边区间,区间[10.5,15],此区间元素数量大于2,因此需要计算;数组中不存在,找最接近的13

    9)15与20之间无,结束。

    2.给定数组float[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }

    输出:5、3、2、4、7、6、8

    代码:

    1. public static Queue<float> FindMiddle(float[] data)
    2. {
    3. if (data.Length < 3) return new Queue<float>();
    4. int leftIndex = 0;
    5. int rightIndex = data.Length - 1;
    6. Queue<float> queue = new Queue<float>(data.Length - 2);
    7. FindMiddle(data, leftIndex, rightIndex, queue);
    8. return queue;
    9. }
    10. static void FindMiddle(float[] data, int leftIndex, int rightIndex, Queue<float> queue)
    11. {
    12. if (rightIndex - 1 <= leftIndex) return;
    13. float target = (data[leftIndex] + data[rightIndex]) / 2f;
    14. int middleIndex = FindClosestNum(data, leftIndex, rightIndex, target, out float value);
    15. queue.Enqueue(value);
    16. FindMiddle(data, leftIndex, middleIndex, queue);
    17. FindMiddle(data, middleIndex, rightIndex, queue);
    18. }
    19. static int FindClosestNum(float[] nums, int leftIndex, int rightIndex, float target, out float middle)
    20. {
    21. int left = leftIndex;
    22. int right = rightIndex;
    23. int mid = 0;
    24. float temp;
    25. while (left <= right)
    26. {
    27. mid = left + ((right - left) >> 1);
    28. temp = nums[mid];
    29. if (temp == target)
    30. {
    31. middle = temp;
    32. return mid;
    33. }
    34. else if (temp < target)
    35. left = mid + 1;
    36. else
    37. right = mid - 1;
    38. }
    39. if (right < 0)
    40. {
    41. middle = nums[left];
    42. return left;
    43. }
    44. else if (left >= nums.Length)
    45. {
    46. middle = nums[right];
    47. return right;
    48. }
    49. else
    50. {
    51. if (Math.Abs(nums[left] - target) < Math.Abs(nums[right] - target))
    52. {
    53. middle = nums[left];
    54. return left;
    55. }
    56. else
    57. {
    58. middle = nums[right];
    59. return right;
    60. }
    61. }
    62. }

    思路:从左边查找中间值,直到找完后找右边,一直到结束

  • 相关阅读:
    现代C++编程实践(八)—关于noexcept修饰符和noexcept操作符
    ES6模块化练习import,export
    golang开发_goroutine在项目中的使用姿势
    学习笔记-SSRF
    Redis数据类型-Hash-存储结构之ziplist
    【快速上手】使用SpringBoot 2.X + Mybatis-Plus 轻松实现CRUD
    Python多重继承
    卷积神经网络(CNN)
    Java 基础面试题大概有哪些?
    训练到第23个epoch中止,无法正常运行
  • 原文地址:https://blog.csdn.net/ftfmatlab/article/details/138634329