当前位置:   article > 正文

限定次数从数组两端获取最大总数(华为od机考题)

限定次数从数组两端获取最大总数(华为od机考题)

一、题目

一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。
每串香蕉的根数由数组numbers给出。
猴子获取香蕉,每次都只能从行的开头或者末尾获取,
并且只能获取N次,求猴子最多能获取多少根香蕉。

二、思路与代码过程

1.思路

对数组获取元素,可以从头或者从尾,一共获取N次。

可以将数组头N个元素存储到队列Qf中,将尾N个元素存储到队列Qb中。

将队列Qf与Qb的头元素进行比较,较大的出列并动态存入graps数组中。

N次比较后将graps数组遍历,每个数相加赋值到maxBananas中。

由此就能得到最多的香蕉数量。

2.代码过程

①main函数

  1. public static void main(String[] args) {
  2. Scanner sc = new Scanner(System.in);
  3. System.out.println("请输入香蕉的串数:");
  4. int n = sc.nextInt();
  5. System.out.println("请输入每串香蕉上的根数:");
  6. int[] numbers = new int[n];
  7. for (int i = 0; i < n; i++) {
  8. numbers[i] = sc.nextInt();
  9. }
  10. System.out.println("香蕉数量数组为"+ Arrays.toString(numbers));
  11. System.out.println("请输入猴子能获取的次数N:");
  12. int N = sc.nextInt();
  13. System.out.printf("在%d次内猴子最多获得%d根香蕉\n",N,maxBanana(numbers,N));
  14. }

②maxBanana函数

主要负责对拿取方式和结果的判断,生成Qf和Qb队列,传入CompareRemove函数,处理传回来的graps数组,往主函数返回maxBananas。

  1. private static int maxBanana(int[] numbers,int N) {
  2. //拿取为零次
  3. if (N == 0 ) {
  4. return 0;
  5. }
  6. //拿取次数大于等于堆数
  7. if ( N >= numbers.length){
  8. int count = 0;
  9. for (int i = 0 ; i < numbers.length ; i++){
  10. count += numbers[i];
  11. }
  12. System.out.println("香蕉堆数小于等于拿取次数,猴子可以全部拿完:"+count);
  13. return count;
  14. }else {
  15. int maxBananas = 0;
  16. int n = numbers.length;
  17. Queue<Integer> Qf = new LinkedList<>();
  18. Queue<Integer> Qb = new LinkedList<>();
  19. for (int i = 0; i < N ; i++) {
  20. Qf.offer(numbers[i]);
  21. Qb.offer(numbers[n-i-1]);
  22. }
  23. System.out.println("前N个数为:"+Arrays.toString(Qf.toArray()));
  24. System.out.println("后N个数为:"+Arrays.toString(Qb.toArray()));
  25. ArrayList<Integer> BananaCount = CompareRemove(Qf,Qb,N);
  26. int bananasNum = 0;
  27. for (int i = 0; i < BananaCount.size(); i++) {
  28. int num = BananaCount.get(i);
  29. bananasNum += num;
  30. }
  31. maxBananas = bananasNum;
  32. return maxBananas;
  33. }
  34. }

③定义全局ArrayList graps确保传参不丢失

public static ArrayList<Integer> graps = new ArrayList<>();

④CompareRemove函数

接受maxBanana的传参Qf、Qb、N。对队列头元素的大小进行判断,并移除加入graps数组。

在遇到相等两端时,进入handleEqual函数。

  1. private static ArrayList CompareRemove(Queue<Integer> qf, Queue<Integer> qb, int N) {
  2. for (int i = 0; i < N ; i++) {
  3. if (qf.isEmpty()||qb.isEmpty()) {
  4. System.out.println("队列一方为空");
  5. break;
  6. }
  7. Integer f = qf.peek();
  8. Integer b = qb.peek();
  9. if(f==null||b==null){
  10. System.out.println("两方队列均为空");
  11. break;
  12. }
  13. if (f>b){
  14. graps.add(qf.poll());
  15. }
  16. if(f<b){
  17. graps.add(qb.poll());
  18. }
  19. if (f==b){
  20. handleEqual(qf,qb,N,graps);
  21. }
  22. }
  23. return graps;
  24. }

⑤handleEqual函数

接受来自CompareRemove的传参:qf、qb、N、graps。

先将相等的两个元素都出列,在graps随便里添加一个(表示这个值我记录了),再将现在少了头元素的两个队列再次放入CompareRemove函数(次数N减一)。

  1. private static void handleEqual(Queue<Integer> qf, Queue<Integer> qb, int N, ArrayList<Integer> graps) {
  2. Integer currentF = qf.poll();
  3. Integer currentB = qb.poll();
  4. graps.add(currentF);
  5. graps =CompareRemove(qf,qb,N-1);
  6. }

三、运行结果

1.带数据分析的完整代码

  1. import java.util.*;
  2. public class test15 {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. System.out.println("请输入香蕉的串数:");
  6. int n = sc.nextInt();
  7. System.out.println("请输入每串香蕉上的根数:");
  8. int[] numbers = new int[n];
  9. for (int i = 0; i < n; i++) {
  10. numbers[i] = sc.nextInt();
  11. }
  12. System.out.println("香蕉数量数组为"+ Arrays.toString(numbers));
  13. System.out.println("请输入猴子能获取的次数N:");
  14. int N = sc.nextInt();
  15. System.out.printf("在%d次内猴子最多获得%d根香蕉\n",N,maxBanana(numbers,N));
  16. }
  17. //将数组numbers的前N个和后N个分别存入队列Qf和Qb,对Qf和Qb进行N次比较,并移除两者中较大一方的元素,进行N次
  18. private static int maxBanana(int[] numbers,int N) {
  19. //拿取为零次
  20. if (N == 0 ) {
  21. return 0;
  22. }
  23. //拿取次数大于等于堆数
  24. if ( N >= numbers.length){
  25. int count = 0;
  26. for (int i = 0 ; i < numbers.length ; i++){
  27. count += numbers[i];
  28. }
  29. System.out.println("香蕉堆数小于等于拿取次数,猴子可以全部拿完:"+count);
  30. return count;
  31. }else {
  32. int maxBananas = 0;
  33. int n = numbers.length;
  34. Queue<Integer> Qf = new LinkedList<>();
  35. Queue<Integer> Qb = new LinkedList<>();
  36. for (int i = 0; i < N ; i++) {
  37. Qf.offer(numbers[i]);
  38. Qb.offer(numbers[n-i-1]);
  39. }
  40. System.out.println("前N个数为:"+Arrays.toString(Qf.toArray()));
  41. System.out.println("后N个数为:"+Arrays.toString(Qb.toArray()));
  42. ArrayList<Integer> BananaCount = CompareRemove(Qf,Qb,N);
  43. int bananasNum = 0;
  44. for (int i = 0; i < BananaCount.size(); i++) {
  45. int num = BananaCount.get(i);
  46. bananasNum += num;
  47. }
  48. maxBananas = bananasNum;
  49. return maxBananas;
  50. }
  51. }
  52. public static ArrayList<Integer> graps = new ArrayList<>();
  53. private static ArrayList CompareRemove(Queue<Integer> qf, Queue<Integer> qb, int N) {
  54. System.out.println("在compareremove第一步graps为:"+String.valueOf(graps));
  55. for (int i = 0; i < N ; i++) {
  56. if (qf.isEmpty()||qb.isEmpty()) {
  57. System.out.println("队列一方为空");
  58. break;
  59. }
  60. Integer f = qf.peek();
  61. Integer b = qb.peek();
  62. if(f==null||b==null){
  63. System.out.println("两方均为空");
  64. break;
  65. }
  66. if (f>b){
  67. System.out.printf("qf的%d大于qb的%d",f,b);
  68. graps.add(qf.poll());
  69. System.out.println("大于后的graps为"+graps);
  70. }
  71. if(f<b){
  72. System.out.printf("qf的%d小于qb的%d",f,b);
  73. graps.add(qb.poll());
  74. System.out.println("小于后的graps为"+graps);
  75. }
  76. if (f==b){
  77. System.out.printf("qf的%d等于qb的%d需要进一步比较\n",f,b);
  78. handleEqual(qf,qb,N-1,graps);//??
  79. System.out.println("\n进入相等解决");
  80. System.out.println("相等解决后的graps为"+graps);
  81. }
  82. }
  83. return graps;
  84. }
  85. private static void handleEqual(Queue<Integer> qf, Queue<Integer> qb, int N, ArrayList<Integer> graps) {
  86. Integer currentF = qf.poll();
  87. Integer currentB = qb.poll();
  88. System.out.println("我是相等解决中的qf:"+qf+",我是相等解决中的qb:"+qb);
  89. graps.add(currentF);
  90. System.out.println("我是相等解决中的graps:"+graps);
  91. graps =CompareRemove(qf,qb,N);
  92. System.out.println("我是相等解决中调用compareremove后的graps:"+graps);
  93. }
  94. }

2.运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/980153
推荐阅读
相关标签
  

闽ICP备14008679号