华为OD机试 - 求幸存数之和(Java & JS & Python & C & C++)
给定一个正整数数组 nums
,一个跳数 jump
和一个幸存数量 left
。从数组索引为 0 的位置开始,每跳过 jump
个数字,就删除一个数字。重复此过程,直到数组中只剩下 left
个数字。求剩余数字的和。
这道题本质上是一个模拟问题,我们可以通过模拟删除元素的过程来得到最终的答案。
解题思路:
jump
个元素删除一个元素。left
个元素。
import java.util.ArrayList;
import java.util.List;
public class SurvivorSum {
public int survivorSum(int[] nums, int jump, int left) {
List<Integer> list = new ArrayList<>();
for (int num : nums) {
list.add(num);
}
int index = 0;
while (list.size() > left) {
list.remove(index);
index = (index + jump) % list.size();
}
int sum = 0;
for (int num : list) {
sum += num;
}
return sum;
}
}
def survivor_sum(nums, jump, left):
while len(nums) > left:
nums.pop((jump - 1) % len(nums))
return sum(nums)
function survivorSum(nums, jump, left) {
while (nums.length > left) {
nums.splice((jump - 1) % nums.length, 1);
}
return nums.reduce((sum, num) => sum + num, 0);
}
#include <vector>
int survivorSum(std::vector<int>& nums, int jump, int left) {
while (nums.size() > left) {
nums.erase(nums.begin() + (jump - 1) % nums.size());
}
int sum = 0;
for (int num : nums) {
sum += num;
}
return sum;
}
#include <stdio.h>
int survivorSum(int nums[], int n, int jump, int left) {
int index = 0;
while (n > left) {
for (int i = index + 1; i < index + jump; i++) {
index = i % n;
}
for (int i = index; i < n - 1; i++) {
nums[i] = nums[i + 1];
}
n--;
index = (index + jump - 1) % n;
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += nums[i];
}
return sum;
}
erase
函数来删除元素,效率更高。这道题考察了对数组操作、模拟算法以及语言特性的掌握。通过模拟删除元素的过程,我们可以有效地解决这个问题。不同的编程语言提供了不同的数组操作方式,选择适合的语言和数据结构可以提高代码的效率和可读性。