赞
踩
华为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,9
4
3
13
从1(索引为0)开始起跳,中间跳过4个数字因此依次删除 6,2,8,5,4,7。 剩余 1,3,9,返回和为13
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
4
3
13
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。