• 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. }

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

  • 相关阅读:
    python的/ 和// 学习
    使用ffmpeg截取视频片段
    【STM32】Cortex_M4 GPIO口概述知识总结
    Linux笔记
    LeetCode 40. Combination Sum II【回溯,剪枝】中等
    垃圾收集算法
    vscode设置latex
    双指针算法——移动零
    阿里云 ACK One 多集群管理全面升级:多集群服务、多集群监控、两地三中心应用容灾
    some和filter、map的区别
  • 原文地址:https://blog.csdn.net/ftfmatlab/article/details/138634329