华为OD统一考试 - 求幸存数之和

题目描述
给一个正整数数列 nums,一个跳数 jump,及幸存数量 left。

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

约束:

0是第一个起跳点
起跳点和命中点之间间隔 jump 个数字,已被敲出的数字不计入在内。
跳到末尾时无缝从头开始(循环查找),并可以多次循环。
若起始时 left > len(nums) 则无需跳数处理过程。
方法设计:

/**
 * @param nums 正整数数列,长度范围 [1, 10000]
 * @param jump 跳数,范围 [1, 10000]
 * @param left 幸存数量,范围 [0, 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

题目解析:
       1.若数组为空,或left = 0,则直接返回0;
       2.从下标位置start,跳过jump个部位'0'的数字,找到新的位置,并更新start;
       3.直到将datas.size() - left个数字变成'0';#牛客AI配图神器#

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <numeric>

int getLeftDataSum(std::vector<int>&amp; datas, int jump, int left)
{
if (!left || datas.empty())
{
return 0;
}

int sum = 0;
int start = 0;
int size = datas.size();
int delNum = size - left;

while (delNum > 0)
{
int count = 0;
for (int i = (start + 1) % size; i < size;)
{
if (datas[i])
{
++count;
}
if (count == jump + 1)
{
datas[i] = 0;
start = i;
--delNum;
break;
}
i = ++i % size;
}
}

sum = std::accumulate(datas.begin(), datas.end(), 0);
return sum;
}

int main()
{
std::string dataStr;
std::cin >> dataStr;
std::istringstream inputStr(dataStr);

std::vector<int> datas;
std::string s;
while (std::getline(inputStr, s, ','))
{
datas.emplace_back(std::stoi(s));
}

int jump = 0;
std::cin >> jump;

int left = 0;
std::cin >> left;

std::cout << &quot;幸存数之和:&quot; << getLeftDataSum(datas, jump, left) << std::endl;

return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务