华为OD机试 - 求幸存数之和(Java & JS & Python & C & C++)

当前位置: 电视猫 > 正则表达式>
电视猫时间: 2024-08-17 15:52:10

  华为OD机试 - 求幸存数之和(Java & JS & Python & C & C++)

华为OD机试 - 求幸存数之和 问题详解与解法

题目描述

给定一个正整数数组 nums,一个跳数 jump 和一个幸存数量 left。从数组索引为 0 的位置开始,每跳过 jump 个数字,就删除一个数字。重复此过程,直到数组中只剩下 left 个数字。求剩余数字的和。

题目分析

这道题本质上是一个模拟问题,我们可以通过模拟删除元素的过程来得到最终的答案。

解题思路:

  1. 初始化: 创建一个列表或数组来存储原始数据,设置两个指针,一个指向当前要删除的元素,另一个指向下一个要开始计数的位置。
  2. 模拟删除:
    • 从起始位置开始,每隔 jump 个元素删除一个元素。
    • 为了避免索引越界,当到达数组末尾时,从数组开头继续计数。
    • 重复上述过程,直到数组中只剩下 left 个元素。
  3. 计算总和: 遍历剩余的元素,计算并返回它们的和。

代码实现

Java

Java
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;
    }
}

Python

Python
def survivor_sum(nums, jump, left):
    while len(nums) > left:
        nums.pop((jump - 1) % len(nums))
    return sum(nums)

JavaScript

JavaScript
function survivorSum(nums, jump, left) {
    while (nums.length > left) {
        nums.splice((jump - 1) % nums.length, 1);
    }
    return nums.reduce((sum, num) => sum + num, 0);
}

C++

C++
#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;
}

C

C
#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;
}

优化

  • C++ 版本中使用了 erase 函数来删除元素,效率更高。
  • C 版本实现相对复杂,可以考虑使用链表或循环数组来优化。
  • 空间优化: 如果原数组可以修改,可以原地删除元素,节省空间。

总结

这道题考察了对数组操作、模拟算法以及语言特性的掌握。通过模拟删除元素的过程,我们可以有效地解决这个问题。不同的编程语言提供了不同的数组操作方式,选择适合的语言和数据结构可以提高代码的效率和可读性。

    最新电视剧
    热门电视剧
    影视资讯
    最新剧情排行榜
    最新电视剧剧情