当前位置:   article > 正文

华为OD机试 - 求幸存数之和(Java 2024 C卷 100分)_给一个正整数列 nums,一个跳数 jump,及幸存数量 left

给一个正整数列 nums,一个跳数 jump,及幸存数量 left

在这里插入图片描述

华为OD机试 2024C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给一个正整数列nums,一个跳数jump,及幸存数量left。运算过程为:从索引为0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1的数字,该数被敲出,并从该点起跳,以此类推,直到幸存left个数为止。然后返回幸存数之和。

约束:

0是第一个起跳点。

起跳点和命中点之间间隔jump 个数字,已被敲出的数字不计入在内。

跳到末尾时无缝从头开始(循环查找),并可以多次循环。

若起始时 left > len(nums) 则无需跳数处理过程。

/**
*
* @param nums  正整数数列,长度范围 [1,10000]
* @param jump  跳数,范围 [1,10000]
* @param left  幸存数量,范围 [1,10000]
* @return 幸存数之和
*/
int sumOfLeft(int[] nums,int jump,int left)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

二、输入描述

第一行输入正整数数列
第二行输入跳数
第三行输入幸存数量

三、输出描述

输出幸存数之和

1、输入

1,2,3,4,5,6,7,8,9
4
3

2、输出

13

3、说明

从1(索引为0)开始起跳,中间跳过4个数字因此依次删除 6,2,8,5,4,7。 剩余 1,3,9,返回和为13

四、解题思路

  1. 转换为列表:将整数数组转换为 ArrayList 以便进行元素的动态删除。
  2. 判断幸存数量:如果 left 大于或等于列表的大小,直接计算并返回整个列表的和,因为不需要执行任何删除操作。
  3. 删除元素:
    • 初始化起始索引 index 为 1,因为问题描述从索引0开始。
    • 使用循环不断移除元素,直到列表的大小缩减到 left 指定的数量。每次循环中:
      • 计算删除元素的索引,使用 (index + jump) % nums.size() 来确保索引在合法范围内并能循环遍历列表。
      • 删除当前索引处的元素。由于元素被删除后,列表大小会缩减,因此当前 index 会自然指向下一个元素的位置。

五、Java算法源码

public class OdTest01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line1 = scanner.nextLine();
        int jump = Integer.parseInt(scanner.nextLine().trim());
        int left = Integer.parseInt(scanner.nextLine().trim());

        int[] numStrs = Arrays.stream(line1.split(",")).mapToInt(Integer::parseInt).toArray();
        System.out.println(sumOfLeft(numStrs, jump, left));
    }

    private static int sumOfLeft(int[] arr, int jump, int left) {
        ArrayList<Integer> nums =(ArrayList<Integer>) Arrays.stream(arr).boxed().collect(Collectors.toList());
        if (left >= nums.size()) {
            return nums.stream().mapToInt(Integer::intValue).sum(); // 如果剩余数量不需删除,直接返回和
        }

        int index = 1; // 初始索引
        while (nums.size() > left) {
            index = (index + jump) % nums.size(); // 计算需要删除的元素索引
            nums.remove(index); // 删除元素
            // 注意:删除后,index指向下一个元素的位置,即原位置的下一个元素成为新的起跳点
        }

        return nums.stream().mapToInt(Integer::intValue).sum(); // 计算并返回剩余元素的和
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

六、效果展示

1、输入

1,2,3,4,5,6,7,8,9
4
3

2、输出

13

3、说明

在这里插入图片描述


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